mirror of
https://github.com/sabnzbd/sabnzbd.git
synced 2026-01-10 08:30:45 -05:00
Compare commits
215 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d69796d351 | ||
|
|
a2d5713477 | ||
|
|
29ec4d9a23 | ||
|
|
22517a7cd7 | ||
|
|
bcc4dd75cf | ||
|
|
97711ca82e | ||
|
|
e782237f27 | ||
|
|
52bb156c08 | ||
|
|
4361d82ddd | ||
|
|
017cf8f285 | ||
|
|
03cdf6ed5d | ||
|
|
cf347a8e90 | ||
|
|
f06afe43e1 | ||
|
|
fb301eb5c8 | ||
|
|
1562c3560b | ||
|
|
9813bc237f | ||
|
|
b39fe059c6 | ||
|
|
a56c770a8b | ||
|
|
e3bf0edad8 | ||
|
|
e35d9e4db3 | ||
|
|
c617d4321a | ||
|
|
0fd3a2881f | ||
|
|
0c1f7633de | ||
|
|
b7d5d49c84 | ||
|
|
9911b93ece | ||
|
|
eeaad00968 | ||
|
|
e1bb8459e3 | ||
|
|
65c3ac0cc0 | ||
|
|
413c02a80f | ||
|
|
80f118f304 | ||
|
|
5c0a10e16b | ||
|
|
d9b32261e7 | ||
|
|
8d8ce52193 | ||
|
|
1cc2e25cda | ||
|
|
4605c3fd30 | ||
|
|
ed7dc3f827 | ||
|
|
e69eeebdd8 | ||
|
|
5da5f1adc1 | ||
|
|
f47e92dec0 | ||
|
|
a894ca5171 | ||
|
|
5abe1140ae | ||
|
|
d34e14370c | ||
|
|
c4f4a3131c | ||
|
|
dcbd9b57f3 | ||
|
|
aad3b54a17 | ||
|
|
cde142a371 | ||
|
|
8bfc98ffc6 | ||
|
|
e46f21d566 | ||
|
|
0e45fdcdfd | ||
|
|
eec7af16d7 | ||
|
|
6532425902 | ||
|
|
44b896522c | ||
|
|
1b16ee44cb | ||
|
|
d5f608c28c | ||
|
|
555d8418e7 | ||
|
|
8c22e35da4 | ||
|
|
95a7924b31 | ||
|
|
5830bebd95 | ||
|
|
d32cf57c75 | ||
|
|
6d9242ebc5 | ||
|
|
cbc4f6a964 | ||
|
|
2a3b2b9556 | ||
|
|
53a219f12b | ||
|
|
48519dcfa0 | ||
|
|
92542c58fe | ||
|
|
7eafe730f9 | ||
|
|
494e72a996 | ||
|
|
84cc86f1d3 | ||
|
|
64479e2e5d | ||
|
|
13b523d9bd | ||
|
|
181881a21b | ||
|
|
86d11095ac | ||
|
|
927ba3cd9d | ||
|
|
6296fc1762 | ||
|
|
60fbe44724 | ||
|
|
29e45da431 | ||
|
|
d82e69eef4 | ||
|
|
8c7d557252 | ||
|
|
a56d6e5517 | ||
|
|
7548d9e975 | ||
|
|
b7e2bd9684 | ||
|
|
f0a243e3d3 | ||
|
|
6e108c9ef2 | ||
|
|
89edcc1924 | ||
|
|
8a6aca47a1 | ||
|
|
d03e5780b8 | ||
|
|
209d8f9b40 | ||
|
|
c257b1be3d | ||
|
|
2c48c8de2e | ||
|
|
a767ef6aed | ||
|
|
ad61d1dd03 | ||
|
|
33c3d187a0 | ||
|
|
4eb486d4e2 | ||
|
|
bfb6c167a4 | ||
|
|
44abf3bdf6 | ||
|
|
c950572592 | ||
|
|
3999cb13fd | ||
|
|
af65075f0c | ||
|
|
de2a2b465b | ||
|
|
cd7a77f02d | ||
|
|
f4a5394b63 | ||
|
|
3fb6a8dedb | ||
|
|
50c8f84eba | ||
|
|
2c7ecdee92 | ||
|
|
72390a793a | ||
|
|
04ad4e5d3e | ||
|
|
5ef9c6a433 | ||
|
|
e6baffc839 | ||
|
|
e361eb25a5 | ||
|
|
9b420e91c9 | ||
|
|
3a4bf971b2 | ||
|
|
1128691c5d | ||
|
|
15043aef3f | ||
|
|
2a3b4afa03 | ||
|
|
00a98efa81 | ||
|
|
f013dd7f0d | ||
|
|
7b91b1c769 | ||
|
|
5583cce322 | ||
|
|
b995c5f992 | ||
|
|
214ac4a53d | ||
|
|
fc7e87f0df | ||
|
|
c0f2f59fc1 | ||
|
|
b90a847a6f | ||
|
|
a58bb385f5 | ||
|
|
9754baeb1c | ||
|
|
ffcd154966 | ||
|
|
97cfe9488c | ||
|
|
374b6f616a | ||
|
|
e2f51595b6 | ||
|
|
04091a16aa | ||
|
|
9d9d2fd9a2 | ||
|
|
5746115331 | ||
|
|
42f1a4926c | ||
|
|
7d87fd461b | ||
|
|
1ba9976979 | ||
|
|
659c199043 | ||
|
|
81a3f53226 | ||
|
|
1cbff28f67 | ||
|
|
8e15acbf30 | ||
|
|
e07be60db6 | ||
|
|
539c9662ff | ||
|
|
b396014f8d | ||
|
|
1db32415b6 | ||
|
|
b24629db6b | ||
|
|
9b5cdcf8fb | ||
|
|
4831415d14 | ||
|
|
a4c51f0b20 | ||
|
|
ec3ba1fb93 | ||
|
|
61966f7036 | ||
|
|
4f69e81841 | ||
|
|
d0d90581df | ||
|
|
8ea5c27633 | ||
|
|
517500fdf3 | ||
|
|
c4c1c9b6ab | ||
|
|
2388889ede | ||
|
|
55cfe878d7 | ||
|
|
a2daaee468 | ||
|
|
2c360e395e | ||
|
|
399cfee594 | ||
|
|
be646ae6ab | ||
|
|
b470253d9f | ||
|
|
b83c493492 | ||
|
|
991277bb01 | ||
|
|
5626013b81 | ||
|
|
2810d37758 | ||
|
|
c2f08f01e0 | ||
|
|
17ff087e06 | ||
|
|
77de565b7c | ||
|
|
54d238aa4d | ||
|
|
379d09f8cc | ||
|
|
00de72b127 | ||
|
|
f9c84fa7dd | ||
|
|
c8e46691bb | ||
|
|
df1bb636e5 | ||
|
|
ff886fad0d | ||
|
|
6dbee7a413 | ||
|
|
3f8fcd7172 | ||
|
|
d94f7388e6 | ||
|
|
ad8b49fea8 | ||
|
|
ce00270c12 | ||
|
|
8c501f8f58 | ||
|
|
ce313ebc65 | ||
|
|
887ad881a2 | ||
|
|
ce40827552 | ||
|
|
2777d89482 | ||
|
|
727b300a0e | ||
|
|
652b021a8e | ||
|
|
fdf33acfbb | ||
|
|
b001bc9b6f | ||
|
|
8802cb1d8c | ||
|
|
e19a2fbae7 | ||
|
|
53e38f98f9 | ||
|
|
e783e227f6 | ||
|
|
f3dfbe4181 | ||
|
|
bcd8ca8bc4 | ||
|
|
816d6a63cd | ||
|
|
88d3f25700 | ||
|
|
80f69b11db | ||
|
|
81a11f20c8 | ||
|
|
9e2a839953 | ||
|
|
3cefcde270 | ||
|
|
87a1eacfe7 | ||
|
|
7cbc1a8419 | ||
|
|
7b5570eb0b | ||
|
|
1a43a4dcf0 | ||
|
|
2c2a6592c7 | ||
|
|
f31de6ee4e | ||
|
|
8fcd1f6b6c | ||
|
|
d7f3a473d7 | ||
|
|
ab2eb0c94e | ||
|
|
e51f4fc45a | ||
|
|
65278120e2 | ||
|
|
2eed355e9c | ||
|
|
018955f4d5 | ||
|
|
12fd63c1cf |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -31,6 +31,3 @@ SABnzbd*.dmg
|
||||
# Some people use Emacs as an editor
|
||||
\#*
|
||||
.\#*
|
||||
|
||||
.DS_Store
|
||||
/venv
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
*******************************************
|
||||
*** This is SABnzbd 2.4.0 ***
|
||||
*** This is SABnzbd 2.3.0 ***
|
||||
*******************************************
|
||||
SABnzbd is an open-source cross-platform binary newsreader.
|
||||
It simplifies the process of downloading from Usenet dramatically,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
SABnzbd 2.3.1
|
||||
SABnzbd 2.3.0
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
0) LICENSE
|
||||
@@ -60,7 +60,6 @@ All platforms
|
||||
|
||||
Windows
|
||||
PyWin32 use "pip install pypiwin32"
|
||||
subprocessww use "pip install subprocessww"
|
||||
|
||||
Essential modules
|
||||
cheetah-2.0.1+ use "pip install cheetah"
|
||||
@@ -72,7 +71,7 @@ Essential modules
|
||||
Optional modules
|
||||
unzip >= 6.00 http://www.info-zip.org/
|
||||
7zip >= 9.20 http://www.7zip.org/
|
||||
sabyenc == 3.3.1 use "pip install sabyenc"
|
||||
sabyenc == 3.0.2 use "pip install sabyenc"
|
||||
More information: https://sabnzbd.org/sabyenc
|
||||
cryptography >= 1.0 use "pip install cryptography"
|
||||
Enables certificate generation and detection of encrypted RAR-files
|
||||
@@ -93,11 +92,12 @@ Start this from a shell terminal (or command prompt):
|
||||
python tools/make_mo.py
|
||||
|
||||
Start this from a shell terminal (or command prompt):
|
||||
python -OO SABnzbd.py
|
||||
python SABnzbd.py
|
||||
|
||||
Within a few seconds your web browser will start and show the user interface.
|
||||
Use the "Help" button in the web-interface to be directed to the Help Wiki.
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
5) TROUBLESHOOTING
|
||||
-------------------------------------------------------------------------------
|
||||
@@ -123,6 +123,7 @@ may help you solve problems easier.
|
||||
Visit our wiki:
|
||||
https://sabnzbd.org/wiki/
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
7) CREDITS
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
4
PKG-INFO
4
PKG-INFO
@@ -1,7 +1,7 @@
|
||||
Metadata-Version: 1.0
|
||||
Name: SABnzbd
|
||||
Version: 2.3.2RC1
|
||||
Summary: SABnzbd-2.3.2RC1
|
||||
Version: 2.3.0
|
||||
Summary: SABnzbd-2.3.0
|
||||
Home-page: https://sabnzbd.org
|
||||
Author: The SABnzbd Team
|
||||
Author-email: team@sabnzbd.org
|
||||
|
||||
@@ -13,6 +13,7 @@ SABnzbd has a good deal of dependencies you'll need before you can get running.
|
||||
|
||||
- `python` (only 2.7.x and higher, but not 3.x.x)
|
||||
- `python-cheetah`
|
||||
- `python-support`
|
||||
- `par2` (Multi-threaded par2 installation guide can be found [here](https://sabnzbd.org/wiki/installation/multicore-par2))
|
||||
- `unrar` (Make sure you get the "official" non-free version of unrar)
|
||||
- `sabyenc` (installation guide can be found [here](https://sabnzbd.org/sabyenc))
|
||||
|
||||
69
README.mkd
69
README.mkd
@@ -1,36 +1,59 @@
|
||||
Release Notes - SABnzbd 2.3.2 RC 1
|
||||
Release Notes - SABnzbd 2.3.0
|
||||
=========================================================
|
||||
|
||||
## Changes since 2.3.1
|
||||
- SABYenc updated to 3.3.2 to fix rare crash during downloading
|
||||
- Minor updates of SABYenc (such as 3.3.2) are no longer mandatory
|
||||
- Server usage graphs are now linked to make comparing servers easier
|
||||
- First article of each file is downloaded first to identify filenames
|
||||
- Jobs finished by Direct Unpack will be post-processed first
|
||||
- URLs that fail to fetch due to server errors will only be retried 10x
|
||||
- Delay between URL retries increases when not specified by server
|
||||
- Job password entered by user is always shown in History
|
||||
- If available, 7zip will be used instead of unzip
|
||||
## SABYenc updated
|
||||
- Improved download performance 10-15% on CPU limited devices
|
||||
by optimizations and by removing redundant article verification.
|
||||
Linux/NAS: Update of SABYenc to version 3.3.1 is required.
|
||||
Update your package or see https://sabnzbd.org/sabyenc
|
||||
Windows/macOS: Update is included in the installers.
|
||||
|
||||
## Bugfixes since 2.3.1
|
||||
- Dropped connections could result in stalled downloads
|
||||
- Pre-queue script output was not always parsed correctly
|
||||
- Notifications were always send for 'Default' category
|
||||
- 'History Retention' also checked on start of program
|
||||
- macOS: Restore compatibility with macOS 10.11.6 on some systems
|
||||
- Windows: Unpacking could fail due to paths not being quoted
|
||||
- Windows: Complete folder in root of drive could crash post-processing
|
||||
- Windows: Automatically correct 'Extra Par2 Parameters' for MultiPar
|
||||
- Windows: Prevent potential pause/unpause loop after tray icon click
|
||||
## Changes since 2.2.1
|
||||
- Option to limit Servers to specific Categories removed
|
||||
- Improved par2 handling and obfuscated files detection
|
||||
- Duplicate filenames in NZB's no longer rejected by default
|
||||
- Set custom URL instead of /sabnzbd/ (in Config > Specials)
|
||||
- Article-state (which servers are tried) is preserved after restart
|
||||
- Auto disconnect (if enabled) only after verification of last item
|
||||
- Slight performance improvement when fetching RSS-feeds
|
||||
- Job title from RSS-feed is shown for URLs being grabbed
|
||||
- URL grabbing can now be individually paused
|
||||
- Scheduler can pause/unpause jobs in specific category
|
||||
- Series Duplicate Checker can allow PROPER/REAL/REPACK versions
|
||||
- Refresh-icon in Glitter when refresh rate is above 2 seconds
|
||||
- Different icon for downloads with Force priority
|
||||
- Show progress during verification of extra files
|
||||
- All dates and times are now time zone independent
|
||||
- API: 'missing' field removed from 'queue', use 'mbmissing'
|
||||
- API: 'warnings' method now returns array for better handling
|
||||
- macOS: Bundled new OpenSSL version with support for TLSv1.2
|
||||
- macOS: No longer linked to system certificate store
|
||||
- macOS and Windows: Installers include Mozilla CA certificates
|
||||
|
||||
## Upgrading from 2.2.x and older
|
||||
## Bugfixes since 2.2.1
|
||||
- Reduce CPU usage with multiple servers
|
||||
- Fix yet another potential stalling issue
|
||||
- Remove Timeout tracebacks
|
||||
- Handle locked history database better
|
||||
- Only warn if number of actual passwords is larger than 30
|
||||
- Unexpected behavior when diskspace becomes critically low
|
||||
- Retried jobs would show incorrect download progress
|
||||
- Password file was loaded from disk excessively
|
||||
- API: Correct listing of downloaded and queued files in 'get_files'
|
||||
- API: Number of bytes missing and downloaded could be slightly off
|
||||
- API: Jobs with Force priority should always have status 'Downloading'
|
||||
- MacOS: Direct Unpack could hang in case of special characters in names
|
||||
- Windows: Unpack could fail if started instantly after previous one
|
||||
- Windows: Download with many par2 sets could get listed as failed
|
||||
|
||||
## Upgrading from 2.1.x and older
|
||||
- Finish queue
|
||||
- Stop SABnzbd
|
||||
- Install new version
|
||||
- Start SABnzbd
|
||||
|
||||
## Upgrade notices
|
||||
- When upgrading from 2.2.0 or older the queue will be converted. Job order,
|
||||
- When upgrading from 2.1.0 or older the queue will be converted. Job order,
|
||||
settings and data will be preserved, but all jobs will be unpaused and
|
||||
URL's that did not finish fetching before the upgrade will be lost.
|
||||
- The organization of the download queue is different from 0.7.x releases.
|
||||
|
||||
@@ -87,7 +87,7 @@ import sabnzbd.interface
|
||||
from sabnzbd.constants import *
|
||||
import sabnzbd.newsunpack
|
||||
from sabnzbd.misc import real_path, \
|
||||
check_latest_version, exit_sab, get_from_url, \
|
||||
check_latest_version, exit_sab, \
|
||||
split_host, get_ext, create_https_certificates, \
|
||||
windows_variant, ip_extract, set_serv_parms, get_serv_parms, globber_full
|
||||
from sabnzbd.panic import panic_tmpl, panic_port, panic_host, \
|
||||
@@ -401,7 +401,7 @@ def print_modules():
|
||||
""" Log all detected optional or external modules """
|
||||
if sabnzbd.decoder.SABYENC_ENABLED:
|
||||
# Yes, we have SABYenc, and it's the correct version, so it's enabled
|
||||
logging.info("SABYenc module (v%s)... found!", sabnzbd.decoder.SABYENC_VERSION)
|
||||
logging.info("SABYenc module (v%s)... found!", sabnzbd.constants.SABYENC_VERSION_REQUIRED)
|
||||
else:
|
||||
# Something wrong with SABYenc, so let's determine and print what:
|
||||
if sabnzbd.decoder.SABYENC_VERSION:
|
||||
@@ -657,7 +657,7 @@ def is_sabnzbd_running(url):
|
||||
url = '%s&mode=version' % (url)
|
||||
# Do this without certificate verification, few installations will have that
|
||||
prev = sabnzbd.set_https_verification(False)
|
||||
ver = get_from_url(url)
|
||||
ver = sabnzbd.newsunpack.get_from_url(url)
|
||||
sabnzbd.set_https_verification(prev)
|
||||
return (ver and (re.search(r'\d+\.\d+\.', ver) or ver.strip() == sabnzbd.__version__))
|
||||
except:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
install:
|
||||
- pip install --upgrade -r tests/requirements.txt
|
||||
- pip install pypiwin32 subprocessww
|
||||
- pip install pypiwin32
|
||||
|
||||
build_script:
|
||||
- pytest
|
||||
|
||||
@@ -596,7 +596,7 @@ class MemcachedSession(Session):
|
||||
# Wrap all .get and .set operations in a single lock.
|
||||
mc_lock = threading.RLock()
|
||||
|
||||
# This is a separate set of locks per session id.
|
||||
# This is a seperate set of locks per session id.
|
||||
locks = {}
|
||||
|
||||
servers = ['127.0.0.1:11211']
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
</td>
|
||||
</tr>
|
||||
<!--#end if#-->
|
||||
<!--#if not $have_unzip and not $have_7zip #-->
|
||||
<!--#if not $have_unzip #-->
|
||||
<tr>
|
||||
<th scope="row">$T('opt-enable_unzip'):</th>
|
||||
<td>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<div class="colmask">
|
||||
<form action="saveGeneral" method="post" name="fullform" class="fullform" autocomplete="off">
|
||||
<form action="saveGeneral" method="post" name="fullform" class="fullform" autocomplete="off" novalidate>
|
||||
<input type="hidden" id="session" name="session" value="$session" />
|
||||
<input type="hidden" id="ajax" name="ajax" value=1 />
|
||||
<div class="section">
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
<!--#end def#-->
|
||||
|
||||
<div class="colmask">
|
||||
<form action="saveEmail" method="post" name="fullform" class="fullform" autocomplete="off">
|
||||
<form action="saveEmail" method="post" name="fullform" class="fullform" autocomplete="off" novalidate>
|
||||
<input type="hidden" id="session" name="session" value="$session" />
|
||||
<input type="hidden" id="ajax" name="ajax" value="1" />
|
||||
<div class="section" id="email">
|
||||
@@ -326,16 +326,6 @@
|
||||
<input type="text" name="pushover_device" id="pushover_device" value="$pushover_device" />
|
||||
<span class="desc">$T('explain-pushover_device')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="pushover_emergency_retry">$T('opt-pushover_emergency_retry')</label>
|
||||
<input type="text" name="pushover_emergency_retry" id="pushover_emergency_retry" value="$pushover_emergency_retry" />
|
||||
<span class="desc">$T('explain-pushover_emergency_retry')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="pushover_emergency_expire">$T('opt-pushover_emergency_expire')</label>
|
||||
<input type="text" name="pushover_emergency_expire" id="pushover_emergency_expire" value="$pushover_emergency_expire" />
|
||||
<span class="desc">$T('explain-pushover_emergency_expire')</span>
|
||||
</div>
|
||||
<!--#set $section_label = 'pushover'#-->
|
||||
<!--#for $type in $notify_keys#-->
|
||||
<div class="field-pair">
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<div class="padTable">
|
||||
<a class="main-helplink" href="$helpuri$help_uri" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a>
|
||||
<p>$T('explain-RSS')</p>
|
||||
<form action="add_rss_feed" method="post" autocomplete="off">
|
||||
<form action="add_rss_feed" method="post" autocomplete="off" novalidate>
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<table class="catTable">
|
||||
<tr>
|
||||
@@ -37,7 +37,7 @@
|
||||
<!--#if $rss#-->
|
||||
<div class="section">
|
||||
<div class="padTable">
|
||||
<form action="save_rss_feed" method="post" autocomplete="off">
|
||||
<form action="save_rss_feed" method="post" autocomplete="off" novalidate>
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<table id="subscriptions">
|
||||
<tbody>
|
||||
@@ -73,7 +73,7 @@
|
||||
</form>
|
||||
<!--#if $feeds#-->
|
||||
<br/>
|
||||
<form action="rss_now" method="post" autocomplete="off">
|
||||
<form action="rss_now" method="post" autocomplete="off" novalidate>
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<button type="submit" class="btn btn-default readAll"><span class="glyphicon glyphicon-sort"></span> $T('button-rssNow')</button>
|
||||
</form>
|
||||
@@ -154,7 +154,7 @@
|
||||
<option value=">"> $T('rss-atleast')</option>
|
||||
<option value="<"> $T('rss-atmost')</option>
|
||||
<option value="F"> $T('rss-from')</option>
|
||||
<option value="F"> $T('rss-from-show') ($T('rss-accept'))</option>
|
||||
<option value="F"> $T('rss-from-show')</option>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
@@ -226,8 +226,8 @@
|
||||
<option value="C"> $T('rss-mustcat')</option>
|
||||
<option value=">"> $T('rss-atleast')</option>
|
||||
<option value="<"> $T('rss-atmost')</option>
|
||||
<option value="S"> $T('rss-from-show')</option>
|
||||
<option value="F"> $T('rss-from')</option>
|
||||
<option value="S"> $T('rss-from-show') ($T('rss-accept'))</option>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
@@ -287,7 +287,7 @@
|
||||
<input type="hidden" name="feed" value="$feed" />
|
||||
<table class="catTable">
|
||||
<tbody>
|
||||
<tr class="<!--#if $odd then " alt " else " "#--> <!--#if $filter[3]!="A" and $filter[3]!="S" then 'disabled_options_rule' else ""#-->">
|
||||
<tr class="<!--#if $odd then " alt " else " "#--> <!--#if $filter[3]!="A" then 'disabled_options_rule' else ""#-->">
|
||||
<td>
|
||||
<input type="checkbox" name="enabled" value="1" <!--#if $filter[6]=='1' then 'checked="checked"' else ""#--> />
|
||||
</td>
|
||||
@@ -302,8 +302,8 @@
|
||||
<option value="C" <!--#if $filter[3]=="C" then 'selected="selected"' else ""#-->> $T('rss-mustcat')</option>
|
||||
<option value=">" <!--#if $filter[3]==">" then 'selected="selected"' else ""#-->> $T('rss-atleast')</option>
|
||||
<option value="<" <!--#if $filter[3]=="<" then 'selected="selected"' else ""#-->> $T('rss-atmost')</option>
|
||||
<option value="S" <!--#if $filter[3]=="S" then 'selected="selected"' else ""#-->> $T('rss-from-show')</option>
|
||||
<option value="F" <!--#if $filter[3]=="F" then 'selected="selected"' else ""#-->> $T('rss-from')</option>
|
||||
<option value="S" <!--#if $filter[3]=="S" then 'selected="selected"' else ""#-->> $T('rss-from-show') ($T('rss-accept'))</option>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
@@ -568,7 +568,7 @@ function urlencode(str) {
|
||||
|
||||
// Only the Accept filter needs all the options
|
||||
\$('form[action="upd_rss_filter"]').find('select[name="filter_type"]').change(function() {
|
||||
\$(this).parent().parent().find('select:not([name="filter_type"])').attr('disabled', \$(this).val() != "A" && \$(this).val() != "S")
|
||||
\$(this).parent().parent().find('select:not([name="filter_type"])').attr('disabled', \$(this).val() != "A")
|
||||
})
|
||||
// Trigger on-load for all
|
||||
\$('.disabled_options_rule').find('td select:not([name="filter_type"])').attr('disabled', true)
|
||||
|
||||
@@ -2,298 +2,107 @@
|
||||
<!--#set global $help_uri="configuration/2.3/servers"#-->
|
||||
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
|
||||
|
||||
<!--
|
||||
We need to find how many months we have recorded so far, so we
|
||||
loop over all the dates to find the lowest value and then use
|
||||
this to calculate the date-selector and maximum value per month.
|
||||
-->
|
||||
<!--#import json#-->
|
||||
<!--#import datetime#-->
|
||||
<!--#import sabnzbd.misc#-->
|
||||
|
||||
<!--#set month_names = [$T('January'), $T('February'), $T('March'), $T('April'), $T('May'), $T('June'), $T('July'), $T('August'), $T('September'), $T('October'), $T('November'), $T('December')] #-->
|
||||
<!--#set min_date = datetime.date.today()#-->
|
||||
<!--#set max_data_all = {}#-->
|
||||
|
||||
<!--#for $server in $servers #-->
|
||||
<!--#if 'amounts' in $server#-->
|
||||
<!--#set max_data_server = {}#-->
|
||||
<!--#for date in $server['amounts'][4]#-->
|
||||
<!--#set split_date = $date.split('-')#-->
|
||||
<!--#set min_date = min(min_date, datetime.date(int(split_date[0]), int(split_date[1]), 1))#-->
|
||||
|
||||
<!--#set month_date = $date[:7]#-->
|
||||
<!--#if $month_date not in $max_data_server#-->
|
||||
<!--#set max_data_server[$month_date] = 0#-->
|
||||
<!--#end if#-->
|
||||
<!--#set max_data_server[$month_date] = max(max_data_server[$month_date], $server['amounts'][4][$date])#-->
|
||||
<!--#end for#-->
|
||||
|
||||
<!--#for month_date in max_data_server#-->
|
||||
<!--#if $month_date not in $max_data_all#-->
|
||||
<!--#set max_data_all[$month_date] = 0#-->
|
||||
<!--#end if#-->
|
||||
<!--#set max_data_all[$month_date] = max(max_data_all[$month_date], max_data_server[$month_date])#-->
|
||||
<!--#end for#-->
|
||||
<!--#end if#-->
|
||||
<!--#end for#-->
|
||||
|
||||
<!--#set months_recorded = list(sabnzbd.misc.monthrange(min_date, datetime.date.today()))#-->
|
||||
<!--#$months_recorded.reverse()#-->
|
||||
|
||||
<script type="text/javascript">
|
||||
// Define variable needed for the server-plots
|
||||
var serverData = {}
|
||||
</script>
|
||||
|
||||
<div class="colmask">
|
||||
<form action="addServer" method="post" autocomplete="off" onsubmit="removeObfuscation();">
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<div id="addServer">
|
||||
<div class="padding alt">
|
||||
<button type="button" class="btn btn-default" id="addServerButton"><span class="glyphicon glyphicon-plus"></span> $T('button-addServer')</button>
|
||||
|
||||
<!--#if $months_recorded#-->
|
||||
<div class="chart-selector-container" title="$T('srv-bandwidth')">
|
||||
<span class="glyphicon glyphicon-signal"></span>
|
||||
<select name="chart-selector" id="chart-selector">
|
||||
<!--#for $cur_date in months_recorded#-->
|
||||
<!--#set month_date = '%d-%02d' % ($cur_date.year, $cur_date.month)#-->
|
||||
<!--#if $month_date not in $max_data_all#-->
|
||||
<!--#set max_data_all[$month_date] = 0#-->
|
||||
<!--#end if#-->
|
||||
<option value="$month_date" data-max="$max_data_all[$month_date]">$month_names[$cur_date.month-1] $cur_date.year</option>
|
||||
<!--#end for#-->
|
||||
<form action="addServer" method="post" autocomplete="off" onsubmit="removeObfuscation();" novalidate>
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<div id="addServer">
|
||||
<div class="padding alt">
|
||||
<button type="button" class="btn btn-default" id="addServerButton"><span class="glyphicon glyphicon-plus"></span> $T('button-addServer')</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="addServerContent" style="display: none;">
|
||||
<div class="col2">
|
||||
<h3>$T('addServer') <a href="$helpuri$help_uri" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="enable">$T('srv-enable')</label>
|
||||
<input type="checkbox" name="enable" id="enable" value="1" checked="checked" />
|
||||
<span class="desc">$T('srv-enable')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="host">$T('srv-host')</label>
|
||||
<input type="text" name="host" id="host" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="port">$T('srv-port')</label>
|
||||
<input type="number" name="port" id="port" size="8" value="119" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="ssl">$T('srv-ssl')</label>
|
||||
<input type="checkbox" name="ssl" id="ssl" value="1" />
|
||||
<span class="desc">$T('explain-ssl')</span>
|
||||
</div>
|
||||
<!-- Tricks to avoid browser auto-fill, fixed on-submit with javascript -->
|
||||
<div class="field-pair">
|
||||
<label class="config" for="${pid}_00">$T('srv-username')</label>
|
||||
<input type="text" name="${pid}_00" id="${pid}_00" data-hide="username" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="${pid}_01">$T('srv-password')</label>
|
||||
<input type="text" name="${pid}_01" id="${pid}_01" data-hide="password" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="connections">$T('srv-connections')</label>
|
||||
<input type="number" name="connections" id="connections" min="0" max="100" value="8" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="priority">$T('srv-priority')</label>
|
||||
<input type="number" name="priority" id="priority" min="0" max="100" /> <i>$T('explain-svrprio')</i>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="retention">$T('srv-retention')</label>
|
||||
<input type="number" name="retention" id="retention" min="0" /> <i>$T('days')</i>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="timeout">$T('srv-timeout')</label>
|
||||
<input type="number" name="timeout" id="timeout" min="30" /> <i>$T('seconds')</i>
|
||||
</div>
|
||||
<div class="field-pair <!--#if int($have_ssl_context) == 0 then "disabled" else ""#--> advanced-settings">
|
||||
<label class="config" for="ssl_verify">$T('opt-ssl_verify')</label>
|
||||
<select name="ssl_verify" id="ssl_verify" <!--#if int($have_ssl_context) == 0 then "disabled=\"disabled\"" else ""#-->>
|
||||
<option value="2" selected>$T('ssl_verify-strict')</option>
|
||||
<option value="1">$T('ssl_verify-normal')</option>
|
||||
<option value="0">$T('ssl_verify-disabled')</option>
|
||||
</select>
|
||||
<span class="desc">$T('explain-ssl_verify').replace('. ', '.<br/>')</span>
|
||||
</div>
|
||||
<!--#end if#-->
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="addServerContent" style="display: none;">
|
||||
<div class="col2">
|
||||
<h3>$T('addServer') <a href="$helpuri$help_uri" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
|
||||
</div>
|
||||
<div class="col1">
|
||||
<fieldset>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="enable">$T('srv-enable')</label>
|
||||
<input type="checkbox" name="enable" id="enable" value="1" checked="checked" />
|
||||
<span class="desc">$T('srv-enable')</span>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="host">$T('srv-host')</label>
|
||||
<input type="text" name="host" id="host" required />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="port">$T('srv-port')</label>
|
||||
<input type="number" name="port" id="port" size="8" value="119" min="0" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="ssl">$T('srv-ssl')</label>
|
||||
<input type="checkbox" name="ssl" id="ssl" value="1" />
|
||||
<span class="desc">$T('explain-ssl')</span>
|
||||
</div>
|
||||
<!-- Tricks to avoid browser auto-fill, fixed on-submit with javascript -->
|
||||
<div class="field-pair">
|
||||
<label class="config" for="${pid}_00">$T('srv-username')</label>
|
||||
<input type="text" name="${pid}_00" id="${pid}_00" data-hide="username" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="${pid}_01">$T('srv-password')</label>
|
||||
<input type="text" name="${pid}_01" id="${pid}_01" data-hide="password" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="connections">$T('srv-connections')</label>
|
||||
<input type="number" name="connections" id="connections" min="1" max="100" value="8" required />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="priority">$T('srv-priority')</label>
|
||||
<input type="number" name="priority" id="priority" min="0" max="99" /> <i>$T('explain-svrprio')</i>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="retention">$T('srv-retention')</label>
|
||||
<input type="number" name="retention" id="retention" min="0" /> <i>$T('days')</i>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="timeout">$T('srv-timeout')</label>
|
||||
<input type="number" name="timeout" id="timeout" min="20" max="240" /> <i>$T('seconds')</i>
|
||||
</div>
|
||||
<div class="field-pair <!--#if int($have_ssl_context) == 0 then "disabled" else ""#--> advanced-settings">
|
||||
<label class="config" for="ssl_verify">$T('opt-ssl_verify')</label>
|
||||
<select name="ssl_verify" id="ssl_verify" <!--#if int($have_ssl_context) == 0 then "disabled=\"disabled\"" else ""#-->>
|
||||
<option value="2" selected>$T('ssl_verify-strict')</option>
|
||||
<option value="1">$T('ssl_verify-normal')</option>
|
||||
<option value="0">$T('ssl_verify-disabled')</option>
|
||||
</select>
|
||||
<span class="desc">$T('explain-ssl_verify').replace('. ', '.<br/>')</span>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="send_group">$T('srv-send_group')</label>
|
||||
<input type="checkbox" name="send_group" id="send_group" value="1" />
|
||||
<span class="desc">$T('srv-explain-send_group')</span>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="optional">$T('srv-optional')</label>
|
||||
<input type="checkbox" name="optional" id="optional" value="1" />
|
||||
<span class="desc">$T('explain-optional')</span>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="displayname">$T('srv-displayname')</label>
|
||||
<input type="text" name="displayname" id="displayname" />
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="notes">$T('srv-notes')</label>
|
||||
<textarea name="notes" id="notes" rows="3" cols="50"></textarea>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<button class="btn btn-default"><span class="glyphicon glyphicon-plus"></span> $T('button-addServer')</button>
|
||||
<button class="btn btn-default advancedButton"><span class="glyphicon glyphicon-cog"></span> $T('button-advanced')</button>
|
||||
<button class="btn btn-default testServer" type="button"><span class="glyphicon glyphicon-sort"></span> $T('button-testServer')</button>
|
||||
</div>
|
||||
<div class="field-pair result-box">
|
||||
<div class="alert"></div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<!--#set $prio_colors = ["#59cc33", "#3366cc","#7f33cc", "#cc33a6", "#cc3333"] #-->
|
||||
<!--#set $cur_prio_color = -1 #-->
|
||||
<!--#set $last_prio = -1 #-->
|
||||
<!--#for $cur, $server in enumerate($servers) #-->
|
||||
<form action="saveServer" method="post" class="fullform" autocomplete="off">
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<input type="hidden" name="server" value="$server['name']" />
|
||||
|
||||
<div class="section <!--#if int($server['enable']) == 0 then 'server-disabled' else ""#-->">
|
||||
<div class="col2 <!--#if int($server['enable']) == 0 then 'server-disabled' else ""#-->">
|
||||
<h3>$server['displayname'] <a href="$helpuri$help_uri" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
|
||||
<!--#if int($server['enable']) != 0 #-->
|
||||
<!--#if $last_prio != $server['priority'] and $cur_prio_color+1 < len($prio_colors) #-->
|
||||
<!--#set $cur_prio_color = $cur_prio_color+1 #-->
|
||||
<!--#set $last_prio = $server['priority'] #-->
|
||||
<!--#end if#-->
|
||||
<span class="label label-primary" style="background-color: $prio_colors[$cur_prio_color]">$server['priority']</span>
|
||||
<span class="label label-primary" style="background-color: $prio_colors[$cur_prio_color]">$T('srv-priority'):</span>
|
||||
<!--#end if#-->
|
||||
<table>
|
||||
<tr>
|
||||
<td><input type="checkbox" class="toggleServerCheckbox" id="enable_$cur" name="$server['name']" value="1" <!--#if int($server['enable']) != 0 then 'checked="checked"' else ""#--> /></td>
|
||||
<td><label for="enable_$cur">$T('enabled')</label></td>
|
||||
</tr>
|
||||
</table>
|
||||
<button type="button" class="btn btn-default showserver"><span class="glyphicon glyphicon-pencil"></span> $T('showDetails')</button>
|
||||
<button type="button" class="btn btn-default clrServer"><span class="glyphicon glyphicon-remove"></span> $T('button-clrServer')</button>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="send_group">$T('srv-send_group')</label>
|
||||
<input type="checkbox" name="send_group" id="send_group" value="1" />
|
||||
<span class="desc">$T('srv-explain-send_group')</span>
|
||||
</div>
|
||||
<div class="col1" style="display:none;">
|
||||
<input type="hidden" name="enable" id="enable$cur" value="$int($server['enable'])" />
|
||||
<fieldset>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="host$cur">$T('srv-host')</label>
|
||||
<input type="text" name="host" id="host$cur" value="$server['host']" required />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="port$cur">$T('srv-port')</label>
|
||||
<input type="number" name="port" id="port$cur" value="$server['port']" size="8" min="0" required />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="ssl$cur">$T('srv-ssl')</label>
|
||||
<input type="checkbox" name="ssl" id="ssl$cur" value="1" <!--#if int($server['ssl']) != 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-ssl')</span>
|
||||
</div>
|
||||
<!-- Tricks to avoid browser auto-fill, fixed on-submit with javascript -->
|
||||
<div class="field-pair">
|
||||
<label class="config" for="${pid}_${cur}0">$T('srv-username')</label>
|
||||
<input type="text" name="${pid}_${cur}0" id="${pid}_${cur}0" value="$server['username']" data-hide="username" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="${pid}_${cur}1">$T('srv-password')</label>
|
||||
<input type="text" name="${pid}_${cur}1" id="${pid}_${cur}1" value="$server['password']" data-hide="password" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="connections$cur">$T('srv-connections')</label>
|
||||
<input type="number" name="connections" id="connections$cur" value="$server['connections']" min="1" max="100" required />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="priority$cur">$T('srv-priority')</label>
|
||||
<input type="number" name="priority" id="priority$cur" value="$server['priority']" min="0" max="99" required /> <i>$T('explain-svrprio')</i>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="retention$cur">$T('srv-retention')</label>
|
||||
<input type="number" name="retention" id="retention$cur" value="$server['retention']" min="0" required /> <i>$T('days')</i>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="timeout$cur">$T('srv-timeout')</label>
|
||||
<input type="number" name="timeout" id="timeout$cur" value="$server['timeout']" min="20" max="240" required /> <i>$T('seconds')</i>
|
||||
</div>
|
||||
|
||||
<div class="field-pair <!--#if int($have_ssl_context) == 0 then "disabled" else ""#--> advanced-settings">
|
||||
<label class="config" for="ssl_verify$cur">$T('opt-ssl_verify')</label>
|
||||
<select name="ssl_verify" id="ssl_verify$cur" <!--#if int($have_ssl_context) == 0 then "disabled=\"disabled\"" else ""#-->>
|
||||
<option value="2" <!--#if $server['ssl_verify'] == 2 then 'selected="selected"' else ""#--> >$T('ssl_verify-strict')</option>
|
||||
<option value="1" <!--#if $server['ssl_verify'] == 1 then 'selected="selected"' else ""#--> >$T('ssl_verify-normal')</option>
|
||||
<option value="0" <!--#if $server['ssl_verify'] == 0 then 'selected="selected"' else ""#--> >$T('ssl_verify-disabled')</option>
|
||||
</select>
|
||||
<span class="desc">$T('explain-ssl_verify').replace('. ', '.<br/>')</span>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="optional$cur">$T('srv-optional')</label>
|
||||
<input type="checkbox" name="optional" id="optional$cur" value="1" <!--#if int($server['optional']) != 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-optional')</span>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="send_group$cur">$T('srv-send_group')</label>
|
||||
<input type="checkbox" name="send_group" id="send_group$cur" value="1" <!--#if int($server['send_group']) != 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('srv-explain-send_group')</span>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="displayname$cur">$T('srv-displayname')</label>
|
||||
<input type="text" name="displayname" id="displayname$cur" value="$server['displayname']" />
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="notes$cur">$T('srv-notes')</label>
|
||||
<textarea name="notes" id="notes$cur" rows="3" cols="50">$server['notes']</textarea>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
|
||||
<button class="btn btn-default advancedButton"><span class="glyphicon glyphicon-cog"></span> $T('button-advanced')</button>
|
||||
<button class="btn btn-default testServer" type="button"><span class="glyphicon glyphicon-sort"></span> $T('button-testServer')</button>
|
||||
<button class="btn btn-default delServer"><span class="glyphicon glyphicon-trash"></span> $T('button-delServer')</button>
|
||||
</div>
|
||||
<div class="field-pair result-box">
|
||||
<div class="alert"></div>
|
||||
</div>
|
||||
</fieldset>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="optional">$T('srv-optional')</label>
|
||||
<input type="checkbox" name="optional" id="optional" value="1" />
|
||||
<span class="desc">$T('explain-optional')</span>
|
||||
</div>
|
||||
<div class="col1" style="display:block;">
|
||||
<!--#if 'amounts' in $server#-->
|
||||
<div class="server-amounts-text">
|
||||
<b>$T('srv-bandwidth'):</b><br/>
|
||||
$T('total'): $(server['amounts'][0])B<br/>
|
||||
$T('today'): $(server['amounts'][3])B<br/>
|
||||
$T('thisWeek'): $(server['amounts'][2])B<br/>
|
||||
$T('thisMonth'): $(server['amounts'][1])B<br/>
|
||||
<span id="server-data-label-${cur}"></span>: <span id="server-data-value-${cur}"></span>
|
||||
</div>
|
||||
<div class="server-chart" data-serverid="${cur}"s>
|
||||
<div id="server-chart-${cur}" class="ct-chart"></div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
// Server data
|
||||
serverData[${cur}] = <!--#echo json.dumps($server['amounts'][4])#-->
|
||||
</script>
|
||||
<!--#end if#-->
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="displayname">$T('srv-displayname')</label>
|
||||
<input type="text" name="displayname" id="displayname" />
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<!--#end for#-->
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="notes">$T('srv-notes')</label>
|
||||
<textarea name="notes" id="notes" rows="3" cols="50"></textarea>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<button class="btn btn-default"><span class="glyphicon glyphicon-plus"></span> $T('button-addServer')</button>
|
||||
<button class="btn btn-default advancedButton"><span class="glyphicon glyphicon-cog"></span> $T('button-advanced')</button>
|
||||
<button class="btn btn-default testServer" type="button"><span class="glyphicon glyphicon-sort"></span> $T('button-testServer')</button>
|
||||
</div>
|
||||
<div class="field-pair result-box">
|
||||
<div class="alert"></div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div><!-- /col1 -->
|
||||
</div><!-- /section -->
|
||||
</form>
|
||||
|
||||
<script type="text/javascript" src="${root}staticcfg/js/chartist.min.js"></script>
|
||||
<script type="text/javascript" src="${root}staticcfg/js/filesize.min.js"></script>
|
||||
<script type="text/javascript">
|
||||
// Standardize chart options
|
||||
// Define variables needed for the server-plots
|
||||
var serverData = {}
|
||||
var chartOptions = {
|
||||
fullWidth: true,
|
||||
showArea: true,
|
||||
@@ -316,76 +125,246 @@
|
||||
right: 20
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<!--
|
||||
We need to find how many months we have recorded so far, so we
|
||||
loop over all the dates to find the lowest value and then use
|
||||
this to calculate the date-selector
|
||||
-->
|
||||
|
||||
function showCharts() {
|
||||
<!--#import json#-->
|
||||
<!--#import datetime#-->
|
||||
<!--#import sabnzbd.misc#-->
|
||||
|
||||
<!--#def show_date_selector($server, $id)#-->
|
||||
<!--#set month_names = [$T('January'), $T('February'), $T('March'), $T('April'), $T('May'), $T('June'), $T('July'), $T('August'), $T('September'), $T('October'), $T('November'), $T('December')] #-->
|
||||
<!--#set min_date = datetime.date.today()#-->
|
||||
<!--#for date in $server['amounts'][4]#-->
|
||||
<!--#set split_date = $date.split('-')#-->
|
||||
<!--#set min_date = min(min_date, datetime.date(int(split_date[0]), int(split_date[1]), 1))#-->
|
||||
<!--#end for#-->
|
||||
<!--#set months_recorded = list(sabnzbd.misc.monthrange(min_date, datetime.date.today()))#-->
|
||||
<!--#$months_recorded.reverse()#-->
|
||||
<select class="chart-selector" name="chart-selector-${id}" id="chart-selector-${id}" data-id="${id}">
|
||||
<!--#for $cur_date in months_recorded#-->
|
||||
<option value="<!--#echo '%d-%02d' % ($cur_date.year, $cur_date.month)#-->">$month_names[$cur_date.month-1] $cur_date.year</option>
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
<!--#end def#-->
|
||||
|
||||
<!--#set $prio_colors = ["#59cc33", "#3366cc","#7f33cc", "#cc33a6", "#cc3333"] #-->
|
||||
<!--#set $cur_prio_color = -1 #-->
|
||||
<!--#set $last_prio = -1 #-->
|
||||
<!--#for $cur, $server in enumerate($servers) #-->
|
||||
<form action="saveServer" method="post" class="fullform" autocomplete="off" novalidate>
|
||||
<input type="hidden" name="session" value="$session" />
|
||||
<input type="hidden" name="server" value="$server['name']" />
|
||||
|
||||
<div class="section <!--#if int($server['enable']) == 0 then 'server-disabled' else ""#-->">
|
||||
<div class="col2 <!--#if int($server['enable']) == 0 then 'server-disabled' else ""#-->">
|
||||
<h3>$server['displayname'] <a href="$helpuri$help_uri" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
|
||||
|
||||
<!--#if int($server['enable']) != 0 #-->
|
||||
<!--#if $last_prio != $server['priority'] and $cur_prio_color+1 < len($prio_colors) #-->
|
||||
<!--#set $cur_prio_color = $cur_prio_color+1 #-->
|
||||
<!--#set $last_prio = $server['priority'] #-->
|
||||
<!--#end if#-->
|
||||
<span class="label label-primary" style="background-color: $prio_colors[$cur_prio_color]">$server['priority']</span>
|
||||
<span class="label label-primary" style="background-color: $prio_colors[$cur_prio_color]">$T('srv-priority'):</span>
|
||||
<!--#end if#-->
|
||||
<table><tr>
|
||||
<td><input type="checkbox" class="toggleServerCheckbox" id="enable_$cur" name="$server['name']" value="1" <!--#if int($server['enable']) != 0 then 'checked="checked"' else ""#--> /></td>
|
||||
<td><label for="enable_$cur">$T('enabled')</label></td>
|
||||
</tr></table>
|
||||
|
||||
<button type="button" class="btn btn-default showserver"><span class="glyphicon glyphicon-pencil"></span> $T('showDetails')</button>
|
||||
<button type="button" class="btn btn-default clrServer"><span class="glyphicon glyphicon-remove"></span> $T('button-clrServer')</button>
|
||||
</div><!-- /col2 -->
|
||||
<div class="col1" style="display:none;">
|
||||
<input type="hidden" name="enable" id="enable$cur" value="$int($server['enable'])" />
|
||||
<fieldset>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="host$cur">$T('srv-host')</label>
|
||||
<input type="text" name="host" id="host$cur" value="$server['host']" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="port$cur">$T('srv-port')</label>
|
||||
<input type="number" name="port" id="port$cur" value="$server['port']" size="8" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="ssl$cur">$T('srv-ssl')</label>
|
||||
<input type="checkbox" name="ssl" id="ssl$cur" value="1" <!--#if int($server['ssl']) != 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-ssl')</span>
|
||||
</div>
|
||||
<!-- Tricks to avoid browser auto-fill, fixed on-submit with javascript -->
|
||||
<div class="field-pair">
|
||||
<label class="config" for="${pid}_${cur}0">$T('srv-username')</label>
|
||||
<input type="text" name="${pid}_${cur}0" id="${pid}_${cur}0" value="$server['username']" data-hide="username" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="${pid}_${cur}1">$T('srv-password')</label>
|
||||
<input type="text" name="${pid}_${cur}1" id="${pid}_${cur}1" value="$server['password']" data-hide="password" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="connections$cur">$T('srv-connections')</label>
|
||||
<input type="number" name="connections" id="connections$cur" value="$server['connections']" min="0" max="100" />
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<label class="config" for="priority$cur">$T('srv-priority')</label>
|
||||
<input type="number" name="priority" id="priority$cur" value="$server['priority']" min="0" max="100" /> <i>$T('explain-svrprio')</i>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="retention$cur">$T('srv-retention')</label>
|
||||
<input type="number" name="retention" id="retention$cur" value="$server['retention']" min="0" /> <i>$T('days')</i>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="timeout$cur">$T('srv-timeout')</label>
|
||||
<input type="number" name="timeout" id="timeout$cur" value="$server['timeout']" min="30" /> <i>$T('seconds')</i>
|
||||
</div>
|
||||
|
||||
<div class="field-pair <!--#if int($have_ssl_context) == 0 then "disabled" else ""#--> advanced-settings">
|
||||
<label class="config" for="ssl_verify$cur">$T('opt-ssl_verify')</label>
|
||||
<select name="ssl_verify" id="ssl_verify$cur" <!--#if int($have_ssl_context) == 0 then "disabled=\"disabled\"" else ""#-->>
|
||||
<option value="2" <!--#if $server['ssl_verify'] == 2 then 'selected="selected"' else ""#--> >$T('ssl_verify-strict')</option>
|
||||
<option value="1" <!--#if $server['ssl_verify'] == 1 then 'selected="selected"' else ""#--> >$T('ssl_verify-normal')</option>
|
||||
<option value="0" <!--#if $server['ssl_verify'] == 0 then 'selected="selected"' else ""#--> >$T('ssl_verify-disabled')</option>
|
||||
</select>
|
||||
<span class="desc">$T('explain-ssl_verify').replace('. ', '.<br/>')</span>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="optional$cur">$T('srv-optional')</label>
|
||||
<input type="checkbox" name="optional" id="optional$cur" value="1" <!--#if int($server['optional']) != 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('explain-optional')</span>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="send_group$cur">$T('srv-send_group')</label>
|
||||
<input type="checkbox" name="send_group" id="send_group$cur" value="1" <!--#if int($server['send_group']) != 0 then 'checked="checked"' else ""#--> />
|
||||
<span class="desc">$T('srv-explain-send_group')</span>
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="displayname$cur">$T('srv-displayname')</label>
|
||||
<input type="text" name="displayname" id="displayname$cur" value="$server['displayname']" />
|
||||
</div>
|
||||
<div class="field-pair advanced-settings">
|
||||
<label class="config" for="notes$cur">$T('srv-notes')</label>
|
||||
<textarea name="notes" id="notes$cur" rows="3" cols="50">$server['notes']</textarea>
|
||||
</div>
|
||||
<div class="field-pair">
|
||||
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
|
||||
<button class="btn btn-default advancedButton"><span class="glyphicon glyphicon-cog"></span> $T('button-advanced')</button>
|
||||
<button class="btn btn-default testServer" type="button"><span class="glyphicon glyphicon-sort"></span> $T('button-testServer')</button>
|
||||
<button class="btn btn-default delServer"><span class="glyphicon glyphicon-trash"></span> $T('button-delServer')</button>
|
||||
</div>
|
||||
<div class="field-pair result-box">
|
||||
<div class="alert"></div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
<div class="col1" style="display:block;">
|
||||
<!--#if 'amounts' in $server#-->
|
||||
<div class="server-amounts-text">
|
||||
<b>$T('srv-bandwidth'):</b><br/>
|
||||
$T('total'): $(server['amounts'][0])B<br/>
|
||||
$T('today'): $(server['amounts'][3])B<br/>
|
||||
$T('thisWeek'): $(server['amounts'][2])B<br/>
|
||||
$T('thisMonth'): $(server['amounts'][1])B
|
||||
</div>
|
||||
<div class="server-chart">
|
||||
$show_date_selector($server, $cur)
|
||||
<div id="server-chart-${cur}" class="ct-chart"></div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
// Server data
|
||||
serverData[${cur}] = <!--#echo json.dumps($server['amounts'][4])#-->
|
||||
\$(document).ready(function() {
|
||||
showChart(${cur}, \$('#chart-selector-${cur}').val())
|
||||
})
|
||||
</script>
|
||||
<!--#end if#-->
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<!--#end for#-->
|
||||
|
||||
</div><!-- /colmask -->
|
||||
|
||||
<script type="text/javascript">
|
||||
function showChart(server_id, month) {
|
||||
// This month
|
||||
var theMonth = \$('#chart-selector').val()
|
||||
var thisDay = new Date()
|
||||
|
||||
// What month are we doing?
|
||||
var inputDate = new Date(theMonth+'-01')
|
||||
var inputDate = new Date(month+'-01')
|
||||
var baseDate = new Date(inputDate.getUTCFullYear(), inputDate.getUTCMonth(), 1)
|
||||
var maxDaysInMonth = new Date(baseDate.getFullYear(), baseDate.getMonth()+1, 0).getDate()
|
||||
|
||||
// Set the new maximum
|
||||
chartOptions.axisY.high = \$('#chart-selector :selected').data('max');
|
||||
chartOptions.axisY.low = 0
|
||||
|
||||
// For each chart
|
||||
\$('.server-chart').each(function(i, elemn) {
|
||||
var server_id = \$(elemn).data('serverid')
|
||||
|
||||
// Fill the data array
|
||||
var data = {
|
||||
labels: [],
|
||||
series: [[]]
|
||||
};
|
||||
var totalThisMonth = 0
|
||||
for(var i = 1; i < maxDaysInMonth+1; i++) {
|
||||
// Add X-label
|
||||
if(i % 3 == 1) {
|
||||
data['labels'].push(i)
|
||||
} else {
|
||||
data['labels'].push(NaN)
|
||||
}
|
||||
|
||||
// Get formatted date
|
||||
baseDate.setDate(i)
|
||||
var dateCheck = toFormattedDate(baseDate)
|
||||
|
||||
// Add data if we have it
|
||||
if(dateCheck in serverData[server_id]) {
|
||||
data['series'][0].push(serverData[server_id][dateCheck])
|
||||
totalThisMonth += serverData[server_id][dateCheck]
|
||||
} else if(thisDay.getYear() == baseDate.getYear() && thisDay.getMonth() == baseDate.getMonth() && thisDay.getDate() < i) {
|
||||
data['series'][0].push(NaN)
|
||||
} else {
|
||||
data['series'][0].push(0)
|
||||
}
|
||||
// Fill the data array
|
||||
var data = {
|
||||
labels: [],
|
||||
series: [[]]
|
||||
};
|
||||
var largestVal = 0
|
||||
for(var i = 1; i < maxDaysInMonth+1; i++) {
|
||||
// Add X-label
|
||||
if(i % 3 == 1) {
|
||||
data['labels'].push(i)
|
||||
} else {
|
||||
data['labels'].push(NaN)
|
||||
}
|
||||
|
||||
// Update the text value
|
||||
\$('#server-data-label-' + server_id).text(\$('#chart-selector :selected').text())
|
||||
\$('#server-data-value-' + server_id).text(filesize(totalThisMonth, {round: 1}))
|
||||
// Get formatted date
|
||||
baseDate.setDate(i)
|
||||
var dateCheck = toFormattedDate(baseDate)
|
||||
|
||||
// Show the chart
|
||||
chart = new Chartist.Line('#server-chart-'+server_id, data, chartOptions);
|
||||
chart.on('created', function(context) {
|
||||
// Make sure to add this as the first child so it's at the bottom
|
||||
context.svg.elem('rect', {
|
||||
x: context.chartRect.x1,
|
||||
y: context.chartRect.y2-1,
|
||||
width: context.chartRect.width(),
|
||||
height: context.chartRect.height()+2,
|
||||
fill: 'none',
|
||||
stroke: '#B9B9B9',
|
||||
'stroke-width': '1px'
|
||||
}, '', context.svg, true)
|
||||
\$('#server-chart-'+server_id+' .ct-label.ct-vertical').each(function(index, elmn) {
|
||||
elmn.innerHTML = filesize(elmn.innerHTML, {round: 1}).replace(' ','')
|
||||
})
|
||||
});
|
||||
// Add data if we have it
|
||||
if(dateCheck in serverData[server_id]) {
|
||||
data['series'][0].push(serverData[server_id][dateCheck])
|
||||
largestVal = Math.max(largestVal, serverData[server_id][dateCheck])
|
||||
} else if(thisDay.getYear() == baseDate.getYear() && thisDay.getMonth() == baseDate.getMonth() && thisDay.getDate() < i) {
|
||||
data['series'][0].push(NaN)
|
||||
} else {
|
||||
data['series'][0].push(0)
|
||||
}
|
||||
}
|
||||
|
||||
// Check if we should shrink the Y-axis values
|
||||
var devideBy = 1024
|
||||
var axisLabel = 'KB'
|
||||
if(largestVal > 1024*1024) {
|
||||
devideBy = 1024*1024
|
||||
axisLabel = 'MB'
|
||||
}
|
||||
if(largestVal > 1024*1024*1024) {
|
||||
devideBy = 1024*1024*1024
|
||||
axisLabel = 'GB'
|
||||
}
|
||||
if(largestVal > 1024*1024*1024*1024) {
|
||||
devideBy = 1024*1024*1024*1024
|
||||
axisLabel = 'TB'
|
||||
}
|
||||
|
||||
// Shrink the value
|
||||
data['series'][0] = data['series'][0].map(function(num) {
|
||||
return num / devideBy;
|
||||
})
|
||||
|
||||
// Show the chart
|
||||
chart = new Chartist.Line('#server-chart-'+server_id, data, chartOptions);
|
||||
chart.on('created', function(context) {
|
||||
// Make sure to add this as the first child so it's at the bottom
|
||||
context.svg.elem('rect', {
|
||||
x: context.chartRect.x1,
|
||||
y: context.chartRect.y2-1,
|
||||
width: context.chartRect.width(),
|
||||
height: context.chartRect.height()+2,
|
||||
fill: 'none',
|
||||
stroke: '#B9B9B9',
|
||||
'stroke-width': '1px'
|
||||
}, '', context.svg, true)
|
||||
\$('#server-chart-'+server_id+' .ct-label.ct-vertical').each(function(index, elmn) {
|
||||
elmn.innerHTML += axisLabel
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
// Need to mitigate timezone effects!
|
||||
@@ -410,17 +389,14 @@
|
||||
/**
|
||||
Update charts when changed
|
||||
**/
|
||||
\$('#chart-selector').on('change', function(elemn) {
|
||||
showCharts()
|
||||
|
||||
\$('.chart-selector').on('change', function(elemn) {
|
||||
showChart(\$(elemn.target).data('id'), \$(elemn.target).val())
|
||||
// Lets us leave (needs to be called after the change event)
|
||||
setTimeout(function() {
|
||||
formWasSubmitted = true;
|
||||
formHasChanged = false;
|
||||
}, 100)
|
||||
})
|
||||
// And on page-load
|
||||
showCharts()
|
||||
|
||||
/**
|
||||
Click events
|
||||
|
||||
@@ -1023,14 +1023,19 @@ input[type="checkbox"] {
|
||||
color: black;
|
||||
}
|
||||
|
||||
.Servers .chart-selector-container {
|
||||
float: right;
|
||||
.Servers .chart-selector {
|
||||
position: absolute;
|
||||
display: block;
|
||||
top: -7px;
|
||||
left: 50%;
|
||||
width: 150px;
|
||||
margin-left: -50px;
|
||||
min-width: initial;
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
.Servers .chart-selector-container .glyphicon {
|
||||
font-size: 1.3em;
|
||||
padding-right: 4px;
|
||||
top: 5px;
|
||||
.Servers .chart-selector:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.Servers .ct-grid.ct-vertical:first-of-type {
|
||||
@@ -1220,8 +1225,7 @@ input[type="checkbox"] {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.Servers .server-chart,
|
||||
.Servers .chart-selector-container {
|
||||
.Servers .server-chart {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.3 KiB |
@@ -1,36 +0,0 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
|
||||
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
|
||||
width="608.000000pt" height="608.000000pt" viewBox="0 0 608.000000 608.000000"
|
||||
preserveAspectRatio="xMidYMid meet">
|
||||
<g transform="translate(0.000000,608.000000) scale(0.100000,-0.100000)"
|
||||
fill="#000000" stroke="none">
|
||||
<path d="M1295 5818 c-46 -17 -81 -45 -107 -86 l-23 -37 -5 -1160 -5 -1160
|
||||
-386 -5 -386 -5 -40 -28 c-80 -56 -113 -173 -70 -257 9 -19 91 -113 182 -209
|
||||
91 -96 165 -177 165 -180 -1 -3 -18 -18 -39 -32 -21 -15 -48 -46 -60 -71 -21
|
||||
-43 -21 -54 -21 -514 0 -441 1 -472 19 -507 18 -36 18 -38 0 -74 -17 -33 -19
|
||||
-61 -19 -236 0 -222 6 -245 74 -305 60 -53 76 -54 851 -50 706 3 710 3 751 25
|
||||
26 13 45 18 51 12 5 -5 32 -17 60 -27 46 -15 77 -44 336 -317 157 -165 300
|
||||
-309 319 -320 24 -14 51 -20 98 -20 47 0 74 6 98 20 19 11 162 155 319 320
|
||||
200 211 295 304 321 315 20 8 46 20 56 26 15 9 26 7 55 -10 36 -21 39 -21 781
|
||||
-21 l745 0 45 25 c24 14 58 45 75 68 l30 44 3 746 2 746 -25 51 c-14 29 -40
|
||||
63 -60 77 l-35 25 170 179 c94 98 178 195 188 214 41 84 9 202 -71 257 l-40
|
||||
28 -386 5 -386 5 -5 1162 -5 1161 -30 43 c-16 23 -48 52 -70 63 l-40 21 -1725
|
||||
2 c-1202 1 -1734 -2 -1755 -9z m3215 -1488 l0 -1080 -284 0 -284 0 -53 -28
|
||||
c-39 -20 -62 -41 -84 -77 l-30 -48 -3 -199 -4 -198 -736 0 c-703 0 -739 -1
|
||||
-779 -19 -41 -19 -42 -19 -79 0 -36 18 -64 19 -510 19 l-472 0 -122 128 -122
|
||||
127 239 5 c258 5 269 8 325 67 61 64 58 -6 58 1243 l0 1140 1470 0 1470 0 0
|
||||
-1080z m32 -1562 l3 -273 408 -3 407 -2 0 -690 0 -690 -690 0 -690 0 0 965 0
|
||||
965 280 0 280 0 2 -272z m558 155 c-19 -21 -75 -80 -125 -130 l-90 -93 -67 0
|
||||
-68 0 0 130 0 130 192 0 192 0 -34 -37z m-3010 -573 l0 -140 -410 0 -410 0 0
|
||||
-130 0 -130 408 -2 407 -3 0 -415 0 -415 -692 -3 -693 -2 0 145 0 145 410 0
|
||||
410 0 0 130 0 130 -410 0 -410 0 0 415 0 415 695 0 695 0 0 -140z m1630 -550
|
||||
l0 -690 -690 0 -690 0 0 420 0 420 410 0 410 0 0 130 0 130 -410 0 -410 0 0
|
||||
140 0 140 690 0 690 0 0 -690z m-611 -967 c-35 -38 -66 -68 -69 -68 -3 0 -34
|
||||
30 -69 68 l-63 67 132 0 132 0 -63 -67z"/>
|
||||
<path d="M4547 2203 c-4 -3 -7 -186 -7 -405 l0 -398 130 0 130 0 0 405 0 405
|
||||
-123 0 c-68 0 -127 -3 -130 -7z"/>
|
||||
<path d="M2902 1533 l3 -128 128 -3 127 -3 0 131 0 130 -130 0 -131 0 3 -127z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.3 KiB |
@@ -1,6 +0,0 @@
|
||||
/*
|
||||
2017 Jason Mulligan <jason.mulligan@avoidwork.com>
|
||||
@version 3.5.11
|
||||
*/
|
||||
"use strict";!function(i){function e(i){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[],d=0,r=void 0,a=void 0,s=void 0,f=void 0,u=void 0,l=void 0,v=void 0,B=void 0,c=void 0,p=void 0,y=void 0,m=void 0,x=void 0,g=void 0;if(isNaN(i))throw new Error("Invalid arguments");return s=!0===e.bits,y=!0===e.unix,a=e.base||2,p=void 0!==e.round?e.round:y?1:2,m=void 0!==e.spacer?e.spacer:y?"":" ",g=e.symbols||e.suffixes||{},x=2===a?e.standard||"jedec":"jedec",c=e.output||"string",u=!0===e.fullform,l=e.fullforms instanceof Array?e.fullforms:[],r=void 0!==e.exponent?e.exponent:-1,B=Number(i),v=B<0,f=a>2?1e3:1024,v&&(B=-B),(-1===r||isNaN(r))&&(r=Math.floor(Math.log(B)/Math.log(f)))<0&&(r=0),r>8&&(r=8),0===B?(n[0]=0,n[1]=y?"":t[x][s?"bits":"bytes"][r]):(d=B/(2===a?Math.pow(2,10*r):Math.pow(1e3,r)),s&&(d*=8)>=f&&r<8&&(d/=f,r++),n[0]=Number(d.toFixed(r>0?p:0)),n[1]=10===a&&1===r?s?"kb":"kB":t[x][s?"bits":"bytes"][r],y&&(n[1]="jedec"===x?n[1].charAt(0):r>0?n[1].replace(/B$/,""):n[1],o.test(n[1])&&(n[0]=Math.floor(n[0]),n[1]=""))),v&&(n[0]=-n[0]),n[1]=g[n[1]]||n[1],"array"===c?n:"exponent"===c?r:"object"===c?{value:n[0],suffix:n[1],symbol:n[1]}:(u&&(n[1]=l[r]?l[r]:b[x][r]+(s?"bit":"byte")+(1===n[0]?"":"s")),n.join(m))}var o=/^(b|B)$/,t={iec:{bits:["b","Kib","Mib","Gib","Tib","Pib","Eib","Zib","Yib"],bytes:["B","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"]},jedec:{bits:["b","Kb","Mb","Gb","Tb","Pb","Eb","Zb","Yb"],bytes:["B","KB","MB","GB","TB","PB","EB","ZB","YB"]}},b={iec:["","kibi","mebi","gibi","tebi","pebi","exbi","zebi","yobi"],jedec:["","kilo","mega","giga","tera","peta","exa","zetta","yotta"]};e.partial=function(i){return function(o){return e(o,i)}},"undefined"!=typeof exports?module.exports=e:"function"==typeof define&&define.amd?define(function(){return e}):i.filesize=e}("undefined"!=typeof window?window:global);
|
||||
//# sourceMappingURL=filesize.min.js.map
|
||||
@@ -170,10 +170,6 @@
|
||||
<div class="col-sm-2">$T('category')</div>
|
||||
<div class="col-sm-10" data-bind="text: historyStatus.category() == '*' ? glitterTranslate.defaultText : historyStatus.category"></div>
|
||||
</div>
|
||||
<div class="row" data-bind="visible: historyStatus.password">
|
||||
<div class="col-sm-2">$T('srv-password')</div>
|
||||
<div class="col-sm-10" data-bind="text: historyStatus.password"></div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-sm-2">$T('msg-path')</div>
|
||||
<div class="col-sm-10" data-bind="text: historyStatus.storage() == '' ? historyStatus.path : historyStatus.storage"></div>
|
||||
|
||||
@@ -150,9 +150,7 @@
|
||||
</div>
|
||||
<div class="row options-function-box">
|
||||
<div class="col-sm-6">
|
||||
<a href="./status/showlog?session=$session" target="_blank" class="btn btn-default" data-tooltip="true" data-placement="top" title="$T('Glitter-logText')">
|
||||
<span class="glyphicon glyphicon-file"></span> $T('link-showLog')
|
||||
</a>
|
||||
<a href="./status/showlog?session=$session" target="_blank" class="btn btn-default"><span class="glyphicon glyphicon-file"></span> $T('link-showLog')</a>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<div class="input-group" data-tooltip="true" data-placement="top" title="$T('logging')">
|
||||
@@ -175,6 +173,7 @@
|
||||
</div>
|
||||
<div data-bind="foreach: statusInfo.servers">
|
||||
<div class="options-server-box">
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-6">$T('swtag-server')</div>
|
||||
<div class="col-sm-6">
|
||||
@@ -651,6 +650,7 @@
|
||||
<button type="button" class="btn btn-danger" data-bind="click: history.emptyHistory" data-action="history-purgeremove-failed"><span class="glyphicon glyphicon-floppy-remove"></span> $T('purgeFailed-Files')</button><hr />
|
||||
<button type="button" class="btn btn-danger" data-bind="click: history.emptyHistory" data-action="history-purge-completed"><span class="glyphicon glyphicon-floppy-saved"></span> $T('purgeCompl')</button><hr />
|
||||
<button type="button" class="btn btn-danger" data-bind="click: history.emptyHistory" data-action="history-purge-page"><span class="glyphicon glyphicon-check"></span> $T('purgePage') <span class="label label-default" data-bind="text: history.historyItems().length"></span></button>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -92,21 +92,21 @@
|
||||
</a>
|
||||
</td>
|
||||
<td class="name">
|
||||
<div class="row-wrap-text" data-bind="visible: !editingName(), css: { 'direct-unpack-text': direct_unpack }">
|
||||
<span data-bind="text: name, attr: { 'title': name_title }"></span>
|
||||
<div class="row-wrap-text" data-bind="visible: !editingName()">
|
||||
<span data-bind="text: name, attr: { 'title': name() }"></span>
|
||||
<!-- ko if: password() -->
|
||||
<small class="queue-item-password">
|
||||
<span class="glyphicon glyphicon-lock"></span>
|
||||
<span data-bind="text: password"></span>
|
||||
</small>
|
||||
<!-- /ko -->
|
||||
<div class="name-icons direct-unpack hover-button" data-bind="visible: direct_unpack" title="$T('opt-direct_unpack')">
|
||||
<span class="glyphicon glyphicon-compressed"></span> <span data-bind="text: direct_unpack"></span>
|
||||
</div>
|
||||
</div>
|
||||
<form data-bind="submit: editingNameSubmit">
|
||||
<input type="text" data-bind="value: nameForEdit, visible: editingName(), hasfocus: editingName" />
|
||||
</form>
|
||||
<div class="name-icons direct-unpack hover-button" data-bind="visible: direct_unpack">
|
||||
<span class="glyphicon glyphicon-compressed"></span> <span data-bind="text: direct_unpack"></span>
|
||||
</div>
|
||||
<div class="name-options" data-bind="visible: !editingName(), css: { disabled: isGrabbing() }">
|
||||
<a href="#" data-bind="click: \$parent.queue.moveButton" class="hover-button buttonMoveToTop" title="$T('Glitter-top')"><span class="glyphicon glyphicon-chevron-up"></span></a>
|
||||
<a href="#" data-bind="click: \$parent.queue.moveButton" class="hover-button buttonMoveToBottom" title="$T('Glitter-bottom')"><span class="glyphicon glyphicon-chevron-down"></span></a>
|
||||
@@ -133,8 +133,8 @@
|
||||
<label data-bind="visible: parent.isMultiEditing()">
|
||||
<input type="checkbox" name="multiedit" title="$T('Glitter-multiSelect')" data-bind="click: parent.addMultiEdit, attr: { 'id': 'multiedit_' + id } " />
|
||||
</label>
|
||||
<!-- ko if: !isGrabbing() -->
|
||||
<div class="dropdown" data-bind="visible: !parent.isMultiEditing()">
|
||||
<!-- ko if: !isGrabbing() -->
|
||||
<div class="dropdown" data-bind="visible: !isGrabbing() && !parent.isMultiEditing()">
|
||||
<a href="#" data-toggle="dropdown" data-bind="click: toggleDropdown">
|
||||
<span class="caret"></span>
|
||||
</a>
|
||||
@@ -144,7 +144,7 @@
|
||||
<span class="glyphicon glyphicon-tag"></span>
|
||||
<select name="Category" class="form-control" data-bind="options: parent.categoriesList, optionsValue: 'catValue', optionsText: 'catText', value: category, event: { change: changeCat }"></select>
|
||||
</li>
|
||||
<!-- ko if: !isFetchingBlocks -->
|
||||
<!-- ko if: (status() != 'Fetching') -->
|
||||
<li title="$T('priority')" data-tooltip="true" data-placement="left">
|
||||
<span class="glyphicon glyphicon-sort-by-attributes-alt"></span>
|
||||
<select name="Priority" class="form-control" data-bind="options: parent.priorityOptions, optionsValue: 'value', optionsText: 'name', value: priority, event: { change: changePriority }"></select>
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
<link rel="apple-touch-icon" sizes="152x152" href="./staticcfg/ico/apple-touch-icon-152x152-precomposed.png" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="./staticcfg/ico/apple-touch-icon-180x180-precomposed.png" />
|
||||
<link rel="apple-touch-icon" sizes="192x192" href="./staticcfg/ico/android-192x192.png" />
|
||||
<link rel="mask-icon" href="./staticcfg/ico/safari-pinned-tab.svg" color="#383F45">
|
||||
<link rel="shortcut icon" type="image/ico" href="./staticcfg/ico/favicon.ico?v=$version" data-bind="attr: { 'href': SABIcon }" />
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="./static/bootstrap/css/bootstrap.min.css?v=$version" />
|
||||
@@ -87,7 +86,6 @@
|
||||
glitterTranslate.moreText = "$T('Glitter-more')";
|
||||
|
||||
glitterTranslate.status = [];
|
||||
glitterTranslate.status['DirectUnpack'] = "$T('opt-direct_unpack')";
|
||||
glitterTranslate.status['Completed'] = "$T('post-Completed')";
|
||||
glitterTranslate.status['Failed'] = "$T('post-Failed')";
|
||||
glitterTranslate.status['Queued'] = "$T('post-Queued')";
|
||||
|
||||
@@ -134,7 +134,7 @@ function displayDateTime(inDate, outFormat, inFormat) {
|
||||
if(outFormat == 'fromNow') {
|
||||
return theMoment.fromNow()
|
||||
} else {
|
||||
return theMoment.local().format(outFormat)
|
||||
return theMoment.format(outFormat)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -785,28 +785,15 @@ function ViewModel() {
|
||||
}
|
||||
|
||||
// Update the servers
|
||||
if(self.statusInfo.servers().length != data.status.servers.length) {
|
||||
// Only now we can subscribe to the log-level-changes! (only at start)
|
||||
if(self.statusInfo.servers().length == 0) {
|
||||
self.statusInfo.loglevel.subscribe(function(newValue) {
|
||||
// Update log-level
|
||||
callSpecialAPI('./status/change_loglevel/', {
|
||||
loglevel: newValue
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
// Empty them, in case of update
|
||||
self.statusInfo.servers([])
|
||||
|
||||
if(self.statusInfo.servers().length == 0) {
|
||||
// Initial add
|
||||
$.each(data.status.servers, function() {
|
||||
self.statusInfo.servers.push({
|
||||
'servername': ko.observable(this.servername),
|
||||
'serveroptional': ko.observable(this.serveroptional),
|
||||
'serverpriority': ko.observable(this.serverpriority),
|
||||
'servertotalconn': ko.observable(this.servertotalconn),
|
||||
'serverssl': ko.observable(this.serverssl),
|
||||
'servername': this.servername,
|
||||
'serveroptional': this.serveroptional,
|
||||
'serverpriority': this.serverpriority,
|
||||
'servertotalconn': this.servertotalconn,
|
||||
'serverssl': this.serverssl,
|
||||
'serversslinfo': ko.observable(this.serversslinfo),
|
||||
'serveractiveconn': ko.observable(this.serveractiveconn),
|
||||
'servererror': ko.observable(this.servererror),
|
||||
@@ -814,20 +801,23 @@ function ViewModel() {
|
||||
'serverconnections': ko.observableArray(this.serverconnections)
|
||||
})
|
||||
})
|
||||
|
||||
// Only now we can subscribe to the log-level-changes!
|
||||
self.statusInfo.loglevel.subscribe(function(newValue) {
|
||||
// Update log-level
|
||||
callSpecialAPI('./status/change_loglevel/', {
|
||||
loglevel: newValue
|
||||
});
|
||||
})
|
||||
} else {
|
||||
// Update
|
||||
$.each(data.status.servers, function(index) {
|
||||
var activeServer = self.statusInfo.servers()[index];
|
||||
activeServer.servername(this.servername),
|
||||
activeServer.serveroptional(this.serveroptional),
|
||||
activeServer.serverpriority(this.serverpriority),
|
||||
activeServer.servertotalconn(this.servertotalconn),
|
||||
activeServer.serverssl(this.serverssl),
|
||||
activeServer.serversslinfo(this.serversslinfo),
|
||||
activeServer.serveractiveconn(this.serveractiveconn),
|
||||
activeServer.servererror(this.servererror),
|
||||
activeServer.serveractive(this.serveractive),
|
||||
activeServer.serveractiveconn(this.serveractiveconn)
|
||||
activeServer.servererror(this.servererror)
|
||||
activeServer.serveractive(this.serveractive)
|
||||
activeServer.serverconnections(this.serverconnections)
|
||||
activeServer.serversslinfo(this.serversslinfo)
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -479,7 +479,6 @@ function QueueModel(parent, data) {
|
||||
self.index = ko.observable(data.index);
|
||||
self.status = ko.observable(data.status);
|
||||
self.isGrabbing = ko.observable(data.status == 'Grabbing' || data.avg_age == '-')
|
||||
self.isFetchingBlocks = data.status == 'Fetching' || data.priority == 'Repair' // No need to update
|
||||
self.totalMB = ko.observable(parseFloat(data.mb));
|
||||
self.remainingMB = ko.observable(parseFloat(data.mbleft))
|
||||
self.missingMB = ko.observable(parseFloat(data.mbmissing))
|
||||
@@ -522,14 +521,7 @@ function QueueModel(parent, data) {
|
||||
})
|
||||
|
||||
// Texts
|
||||
self.name_title = ko.pureComputed(function() {
|
||||
// When hovering over the job
|
||||
if(self.direct_unpack()) {
|
||||
return self.name() + ' - ' + glitterTranslate.status['DirectUnpack'] + ': ' + self.direct_unpack()
|
||||
}
|
||||
return self.name()
|
||||
})
|
||||
self.missingText = ko.pureComputed(function() {
|
||||
self.missingText= ko.pureComputed(function() {
|
||||
// Check for missing data, the value is arbitrary! (1%)
|
||||
if(self.missingMB()/self.totalMB() > 0.01) {
|
||||
return self.missingMB().toFixed(0) + ' MB ' + glitterTranslate.misingArt
|
||||
@@ -700,7 +692,7 @@ function QueueModel(parent, data) {
|
||||
}
|
||||
self.changePriority = function(item, event) {
|
||||
// Not if we are fetching extra blocks for repair!
|
||||
if(item.isFetchingBlocks) return
|
||||
if(item.status() == 'Fetching') return
|
||||
callAPI({
|
||||
mode: 'queue',
|
||||
name: 'priority',
|
||||
|
||||
@@ -184,7 +184,6 @@ td.name .name-icons span,
|
||||
.navbar-nav .open .dropdown-menu>li>a,
|
||||
.dropdown-header,
|
||||
#modal-help small,
|
||||
.hover-button.glyphicon-forward,
|
||||
pre {
|
||||
color: #EBEBEB !important;
|
||||
opacity: 1 !important;
|
||||
|
||||
@@ -633,17 +633,9 @@ td.name .row-wrap-text {
|
||||
margin-left: 3px;
|
||||
}
|
||||
|
||||
.queue-table td.name .direct-unpack-text {
|
||||
max-width: calc(100% - 75px);
|
||||
}
|
||||
|
||||
.queue-table td.name:hover .row-wrap-text {
|
||||
max-width: calc(100% - 125px);
|
||||
/* Change for each size! */
|
||||
}
|
||||
|
||||
.queue-table td.name:hover .direct-unpack {
|
||||
display: none;
|
||||
/* Change for each size! */
|
||||
}
|
||||
|
||||
.queue-table td.name:hover .name-options {
|
||||
@@ -772,8 +764,8 @@ tr.queue-item>td:first-child>a {
|
||||
line-height: 24px;
|
||||
overflow: visible;
|
||||
margin-bottom: 0;
|
||||
box-shadow: inset 0 0px 2px rgba(0, 0, 0, 0.2);
|
||||
-webkit-box-shadow: inset 0 0px 2px rgba(0, 0, 0, 0.2);
|
||||
box-shadow: inset 0 0px 1px rgba(0, 0, 0, 0.3);
|
||||
-webkit-box-shadow: inset 0 0px 1px rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
.progress>span,
|
||||
@@ -1867,6 +1859,7 @@ input[name="nzbURL"] {
|
||||
td.name .name-icons {
|
||||
margin-left: 0px;
|
||||
margin-right: -5px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
td.name .row-wrap-text {
|
||||
@@ -1894,6 +1887,7 @@ input[name="nzbURL"] {
|
||||
.history-queue-swicher .nav-tabs>li>a {
|
||||
border-bottom: inherit;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@media screen and (min-width: 768px) {
|
||||
@@ -1905,6 +1899,7 @@ input[name="nzbURL"] {
|
||||
min-width: 715px;
|
||||
}
|
||||
|
||||
|
||||
.queue .sortable-placeholder td {
|
||||
padding: 9px 0px 8px !important;
|
||||
}
|
||||
|
||||
@@ -141,12 +141,8 @@ tr.queue-item>td:first-child>a {
|
||||
margin-top: 3px;
|
||||
}
|
||||
|
||||
.queue-table td.name .direct-unpack {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.queue-table td.name .name-options {
|
||||
display: inline-block;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.queue-table td.name .name-options small {
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
<link rel="apple-touch-icon" sizes="152x152" href="${path}staticcfg/ico/apple-touch-icon-152x152-precomposed.png" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="${path}staticcfg/ico/apple-touch-icon-180x180-precomposed.png" />
|
||||
<link rel="apple-touch-icon" sizes="192x192" href="${path}staticcfg/ico/android-192x192.png" />
|
||||
<link rel="mask-icon" href="${path}staticcfg/ico/safari-pinned-tab.svg" color="#383F45">
|
||||
|
||||
<script type="text/javascript" src="${path}static/javascripts/lib.js?$version"></script>
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 726 B After Width: | Height: | Size: 729 B |
@@ -20,7 +20,6 @@
|
||||
<link rel="apple-touch-icon" sizes="152x152" href="./staticcfg/ico/apple-touch-icon-152x152-precomposed.png" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="./staticcfg/ico/apple-touch-icon-180x180-precomposed.png" />
|
||||
<link rel="apple-touch-icon" sizes="192x192" href="./staticcfg/ico/android-192x192.png" />
|
||||
<link rel="mask-icon" href="./staticcfg/ico/safari-pinned-tab.svg" color="#383F45">
|
||||
|
||||
<script type="text/javascript" src="static/MochiKit/MochiKit.js"></script>
|
||||
<script type="text/javascript" src="static/PlotKit/PlotKit.js"></script>
|
||||
|
||||
16146
interfaces/smpl/templates/static/MochiKit/MochiKit.js
vendored
16146
interfaces/smpl/templates/static/MochiKit/MochiKit.js
vendored
File diff suppressed because it is too large
Load Diff
@@ -1,2 +1,2 @@
|
||||
dojo.hostenv.conditionalLoadModule({"common": ["MochiKit.MochiKit"]});
|
||||
dojo.hostenv.moduleLoaded("MochiKit.*");
|
||||
dojo.hostenv.conditionalLoadModule({"common": ["MochiKit.MochiKit"]});
|
||||
dojo.hostenv.moduleLoaded("MochiKit.*");
|
||||
|
||||
@@ -16,10 +16,6 @@
|
||||
<input type="radio" name="lang" id="$l" value="$l" <!--#if $lang == $l then 'checked="checked"' else ''#--> />
|
||||
</label>
|
||||
<!--#end for#-->
|
||||
<!--#if not $languages#-->
|
||||
<hr>
|
||||
No language files detected. Please run <code>python tools/make_mo.py</code> once and restart SABnzbd, or contact your package provider.
|
||||
<!--#end if#-->
|
||||
<div class="spacer"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
The original author of SABnzbd based his work on Pynewsleecher by Freddy@madcowdesease.org.
|
||||
|
||||
Few parts of Pynewsleecher have survived the generations of SABnzbd in a
|
||||
recognizable form.
|
||||
Still, we wish to thank Freddy for his inspiration.
|
||||
|
||||
The home of the Pynewsleecher project:
|
||||
http://www.madcowdisease.org/mcd/pynewsleecher
|
||||
|
||||
The software does not carry any license information.
|
||||
|
||||
The original author of SABnzbd based his work on Pynewsleecher by Freddy@madcowdesease.org.
|
||||
|
||||
Few parts of Pynewsleecher have survived the generations of SABnzbd in a
|
||||
recognizable form.
|
||||
Still, we wish to thank Freddy for his inspiration.
|
||||
|
||||
The home of the Pynewsleecher project:
|
||||
http://www.madcowdisease.org/mcd/pynewsleecher
|
||||
|
||||
The software does not carry any license information.
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
On http://www.brunningonline.net/simon/blog/archives/001835.html,
|
||||
the author licensed SysTrayIcon.py under a variant of the WTFPL:
|
||||
|
||||
> Any road up, help yourself. Consider SysTrayIcon.py to be under an
|
||||
> "Aleister Crowley" style license - "Do what thou wilt shall be the
|
||||
> only law".
|
||||
>
|
||||
> Err, but don't sue me if it doesn't work. ;-)
|
||||
On http://www.brunningonline.net/simon/blog/archives/001835.html,
|
||||
the author licensed SysTrayIcon.py under a variant of the WTFPL:
|
||||
|
||||
> Any road up, help yourself. Consider SysTrayIcon.py to be under an
|
||||
> "Aleister Crowley" style license - "Do what thou wilt shall be the
|
||||
> only law".
|
||||
>
|
||||
> Err, but don't sue me if it doesn't work. ;-)
|
||||
|
||||
@@ -5,14 +5,14 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-2.4.0-develop\n"
|
||||
"Project-Id-Version: SABnzbd-2.3.0-develop\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: shypike@sabnzbd.org\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ASCII\n"
|
||||
"Content-Transfer-Encoding: 7bit\n"
|
||||
"POT-Creation-Date: 2017-11-17 22:23+W. Europe Standard Time\n"
|
||||
"POT-Creation-Date: 2017-09-10 21:44+W. Europe Daylight Time\n"
|
||||
"Generated-By: pygettext.py 1.5\n"
|
||||
|
||||
|
||||
@@ -372,6 +372,10 @@ msgstr ""
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr ""
|
||||
@@ -388,6 +392,10 @@ msgstr ""
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr ""
|
||||
@@ -439,6 +447,10 @@ msgstr ""
|
||||
msgid "Error removing %s"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/dirscanner.py [Error message]
|
||||
msgid "Error while adding %s, removing"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/dirscanner.py [Error message] # sabnzbd/dirscanner.py [Error message]
|
||||
msgid "Cannot read Watched Folder %s"
|
||||
msgstr ""
|
||||
@@ -534,12 +546,6 @@ msgstr ""
|
||||
msgid "Email succeeded"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr ""
|
||||
@@ -674,10 +680,6 @@ msgstr ""
|
||||
msgid "Incorrect parameter"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid "Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr ""
|
||||
@@ -734,10 +736,6 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -913,7 +911,6 @@ msgstr ""
|
||||
msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -939,6 +936,10 @@ msgstr ""
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
msgstr ""
|
||||
@@ -1045,6 +1046,11 @@ msgstr ""
|
||||
msgid "Not available"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr ""
|
||||
@@ -1053,7 +1059,7 @@ msgstr ""
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr ""
|
||||
|
||||
@@ -1390,7 +1396,7 @@ msgstr ""
|
||||
msgid "Unable to bind to port %s on %s. Some other software uses the port or SABnzbd is already running."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr ""
|
||||
|
||||
@@ -1410,10 +1416,6 @@ msgstr ""
|
||||
msgid "Completed Download Folder %s is on FAT file system, limiting maximum file size to 4GB"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid "Module subprocessww missing. Expect problems with Unicoded file and directory names in downloads."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr ""
|
||||
@@ -1442,6 +1444,10 @@ msgstr ""
|
||||
msgid "Failed to move files"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr ""
|
||||
@@ -1462,7 +1468,7 @@ msgstr ""
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr ""
|
||||
|
||||
@@ -3246,7 +3252,7 @@ msgstr ""
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Maximum retries"
|
||||
msgstr ""
|
||||
|
||||
@@ -3702,22 +3708,6 @@ msgstr ""
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr ""
|
||||
@@ -4118,10 +4108,6 @@ msgstr ""
|
||||
msgid "WARNING:"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr ""
|
||||
@@ -4286,10 +4272,6 @@ msgstr ""
|
||||
msgid "Refresh"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "All usernames, passwords and API-keys are automatically removed from the log and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr ""
|
||||
@@ -4434,6 +4416,10 @@ msgstr ""
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr ""
|
||||
|
||||
109
po/main/da.po
109
po/main/da.po
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-11-20 21:21+0000\n"
|
||||
"PO-Revision-Date: 2017-10-27 21:53+0000\n"
|
||||
"Last-Translator: Søren <Unknown>\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2017-06-22 07:07+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
|
||||
"Language-Team: Danish <da@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2017-11-21 05:47+0000\n"
|
||||
"X-Generator: Launchpad (build 18505)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:24+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -29,14 +29,11 @@ msgstr "Kan ikke finde webskabeloner: %s, forsøger med standardskabelon"
|
||||
msgid ""
|
||||
"SABYenc disabled: no correct version found! (Found v%s, expecting v%s)"
|
||||
msgstr ""
|
||||
"SABYenc deaktiveret: Der blev ikke fundet nogen korrekt version (Fandt v%s, "
|
||||
"forventede v%s)"
|
||||
|
||||
#: SABnzbd.py [Warning message]
|
||||
msgid ""
|
||||
"SABYenc module... NOT found! Expecting v%s - https://sabnzbd.org/sabyenc"
|
||||
msgstr ""
|
||||
"SABYenc modul... IKKE fundet! Forventede v%s - https://sabnzbd.org/sabyenc"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "_yenc module... NOT found!"
|
||||
@@ -48,11 +45,11 @@ msgstr "par2 binær... IKKE fundet!"
|
||||
|
||||
#: SABnzbd.py [Error message] # SABnzbd.py [Error message]
|
||||
msgid "Verification and repair will not be possible."
|
||||
msgstr "Verificering og reperation er ikke muligt."
|
||||
msgstr ""
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "MultiPar binary... NOT found!"
|
||||
msgstr "MultiPar binær... IKKE fundet!"
|
||||
msgstr ""
|
||||
|
||||
#: SABnzbd.py [Warning message]
|
||||
msgid "Your UNRAR version is %s, we recommend version %s or higher.<br />"
|
||||
@@ -60,7 +57,7 @@ msgstr "Din Unrar version er %s, vi anbefaler version %s eller højere.<br />"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Downloads will not unpacked."
|
||||
msgstr "Downloads vil ikke blive udpakket."
|
||||
msgstr ""
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "unrar binary... NOT found"
|
||||
@@ -401,6 +398,10 @@ msgstr "Beskadigede historik database, skabte tom udskiftning"
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "SQL Kommando mislykkedes, se logg"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "SQL Commit mislykkedes, se logg"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "Det lykkedes ikke at lukke databasen, se logg"
|
||||
@@ -417,6 +418,10 @@ msgstr "Afkodning af %s mislykkedes"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr "Dekoder fejl: Ikke mere hukommelse"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "CRC Fejl i %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Forkert udformet yEnc artikel i %s"
|
||||
@@ -567,12 +572,6 @@ msgstr "Det lykkedes ikke at lukke e-mail tilslutning"
|
||||
msgid "Email succeeded"
|
||||
msgstr "E-mail afsendelse mislykkedes"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Kan ikke sende, mangler nødvendige data"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "Kan ikke finde e-mail skabeloner i %s"
|
||||
@@ -740,11 +739,6 @@ msgstr "Udefineret server"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Fejl parameter"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Tilbage"
|
||||
@@ -803,10 +797,6 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "Det lykkedes ikke at ændre rettigheder på %s"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Køre script"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -982,7 +972,6 @@ msgstr "Starter reparation"
|
||||
msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr "Par verificering mislykkedes på %s, mens QuickCheck lykkedes"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -1011,6 +1000,10 @@ msgstr "[%s] Bekræftelse i %s, alle filer er ok"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Bekræftelse i %s, kræver reparation"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Hovedarkiv mangler..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1120,6 +1113,11 @@ msgstr "Andre beskeder"
|
||||
msgid "Not available"
|
||||
msgstr "Ikke tilgængelig"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Kan ikke sende, mangler nødvendige data"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Kunne ikke sende Prowl besked"
|
||||
@@ -1128,7 +1126,7 @@ msgstr "Kunne ikke sende Prowl besked"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Dårlig respons fra pushover (%s): %s"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "Det lykkedes ikke at sende pushover besked"
|
||||
|
||||
@@ -1499,7 +1497,7 @@ msgid ""
|
||||
"SABnzbd is already running."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Alvorlig fejl"
|
||||
|
||||
@@ -1521,12 +1519,6 @@ msgid ""
|
||||
"size to 4GB"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr "Overførslen kan mislykkes, kun %s af det krævede %s tilgængelig"
|
||||
@@ -1555,6 +1547,10 @@ msgstr "Det lykkedes ikke at omdøbe \"%s\" til \"%s\""
|
||||
msgid "Failed to move files"
|
||||
msgstr "Kunne ikke flytte filer"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Køre script"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Kør bruger script %s"
|
||||
@@ -1575,7 +1571,7 @@ msgstr "Mere"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "Efterbehandling mislykkedes for %s (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "se logfil"
|
||||
|
||||
@@ -3502,7 +3498,7 @@ msgstr "SSL-chifre"
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr "Øge ydeevnen ved at tvinge en lavere SSL-kryptering styrke."
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Maksimalt antal forsøg"
|
||||
|
||||
@@ -3979,22 +3975,6 @@ msgstr "Enhed(er)"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "Enhed(er) som meddelelse skal sendes til"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4414,10 +4394,6 @@ msgstr "I tilfælde af SABnzbd genstart vil denne skærm forsvinde automatisk!"
|
||||
msgid "WARNING:"
|
||||
msgstr "ADVARSEL:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Hent"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Opdateringsfrekvens"
|
||||
@@ -4586,12 +4562,6 @@ msgstr "Pause i..."
|
||||
msgid "Refresh"
|
||||
msgstr "Opdatere"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Sortere efter alder <small>Ældst→Nyeste</small>"
|
||||
@@ -4740,6 +4710,10 @@ msgstr ""
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Bloker genopfriskninger ved at hænge over"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Hent"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Upload"
|
||||
@@ -5004,12 +4978,6 @@ msgstr "URL hentning mislykkedes; %s"
|
||||
#~ msgid "Folder \"%s\" does not exist"
|
||||
#~ msgstr "Mappen \"%s\" findes ikke"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "SQL Commit mislykkedes, se logg"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "CRC Fejl i %s (%s -> %s)"
|
||||
|
||||
#~ msgid "Error: No secondary interface defined."
|
||||
#~ msgstr "Fejl: Ingen sekundær bruger grænseflade defineret."
|
||||
|
||||
@@ -5065,9 +5033,6 @@ msgstr "URL hentning mislykkedes; %s"
|
||||
#~ msgid "Unpacking failed, an expected file was not unpacked"
|
||||
#~ msgstr "Udpakning mislykkedes, en ventet fil er ikke udpakket"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Hovedarkiv mangler..."
|
||||
|
||||
#~ msgid "Error importing OpenSSL module. Connecting with NON-SSL"
|
||||
#~ msgstr "Mislykkedes med importering af OpenSSL modul. Tilslutter uden SSL"
|
||||
|
||||
|
||||
114
po/main/de.po
114
po/main/de.po
@@ -7,15 +7,19 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-11-20 21:21+0000\n"
|
||||
"PO-Revision-Date: 2017-10-10 19:03+0000\n"
|
||||
"Last-Translator: Robin Munkittrick <Unknown>\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2017-08-24 15:39+0000\n"
|
||||
"Last-Translator: jcfp <Unknown>\n"
|
||||
"Language-Team: German <de@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2017-11-21 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 18505)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:24+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "MultiPar binary... NOT found!"
|
||||
msgstr "MultiPar Programmdatei nicht gefunden!"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "MultiPar binary... NOT found!"
|
||||
@@ -416,6 +420,10 @@ msgstr "Verlaufsdatenbank geschädigt, eine leere neue wurde erstellt"
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "SQL-Befehl fehlgeschlagen. Beachten Sie das Nachrichtenprotokoll."
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "SQL-Commit fehlgeschlagen. Beachten Sie das Nachrichtenprotokoll."
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr ""
|
||||
@@ -433,6 +441,10 @@ msgstr "Fehler beim Dekodieren von %s."
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr "Decoder Fehler: Nicht genügend Speicher"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "CRC-Fehler in %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Ungültiger yEnc-Artikel in %s"
|
||||
@@ -586,12 +598,6 @@ msgstr "Schliessen der Mail-Verbindung fehlgeschlagen"
|
||||
msgid "Email succeeded"
|
||||
msgstr "E-Mail erfolgreich versendet"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Absenden nicht möglich, benötigte Daten fehlen"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "In %s konnten keine E-Mail-Vorlagen gefunden werden"
|
||||
@@ -761,11 +767,6 @@ msgstr "Undefinierter Server!"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Fehlerhafter Parameter"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Zurück"
|
||||
@@ -827,10 +828,6 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "Rechte von %s konnten nicht geändert werden"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Ausführen des Skripts"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -1010,7 +1007,6 @@ msgstr ""
|
||||
"Par-Verifikation für \"%s\" fehlgeschlagen, obwohl der QuickCheck "
|
||||
"erfolgreich war"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -1039,6 +1035,10 @@ msgstr "[%s] Überprüft in %s. Alle Dateien fehlerfrei."
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Überprüft in %s. Reparatur wird benötigt."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Hauptpaket nicht gefunden …"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1087,7 +1087,7 @@ msgstr "Überprüfen"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Checking extra files"
|
||||
msgstr "Überprüfe zusätzliche Dateien"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP status]
|
||||
@@ -1096,7 +1096,7 @@ msgstr "Wird überprüft"
|
||||
|
||||
#: sabnzbd/newsunpack.py [Error message]
|
||||
msgid "Python script \"%s\" does not have execute (+x) permission set"
|
||||
msgstr "Dem Pythonskript \"%s\" fehlen die Ausführungsrechte (+x)"
|
||||
msgstr "Dem Pythonskript \"%s\" fehlen die Ausführenrechte (+x)"
|
||||
|
||||
#: sabnzbd/newswrapper.py
|
||||
msgid "This server does not allow SSL on this port"
|
||||
@@ -1155,6 +1155,11 @@ msgstr "Andere Nachrichten"
|
||||
msgid "Not available"
|
||||
msgstr "Nicht verfügbar"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Absenden nicht möglich, benötigte Daten fehlen"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Konnte Prowl-Nachricht nicht versenden"
|
||||
@@ -1163,7 +1168,7 @@ msgstr "Konnte Prowl-Nachricht nicht versenden"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Fehlerhafte Antwort von Pushbullet (%s): %s"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "Konnte Pushover-Nachricht nicht versenden"
|
||||
|
||||
@@ -1548,7 +1553,7 @@ msgstr ""
|
||||
"Konnte nicht an Port %s auf %s starten. Eine andere Software nutzt diesen "
|
||||
"Port oder SABnzbd läuft bereits."
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Schwerwiegender Fehler"
|
||||
|
||||
@@ -1575,14 +1580,6 @@ msgstr ""
|
||||
"Download-Ordner %s für abgeschlossene Downloads auf FAT Dateisystem, ist "
|
||||
"auf maximale Dateigröße von 4GB begrenzt."
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
"Modul subprocessww fehlt. Fehler mit Unikodierter Datei und Verzeichnisnamen "
|
||||
"in den Downloads sind zu erwarten."
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr ""
|
||||
@@ -1612,6 +1609,10 @@ msgstr "Fehler beim Umbenennen von \"%s\" nach \"%s\""
|
||||
msgid "Failed to move files"
|
||||
msgstr "Dateien verschieben fehlgeschlagen"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Ausführen des Skripts"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Ausführen des Benutzer-Skripts %s"
|
||||
@@ -1632,7 +1633,7 @@ msgstr "Mehr"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "Nachbearbeitung von %s fehlgeschlagen (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "Beachten Sie die Protokolldatei"
|
||||
|
||||
@@ -2807,8 +2808,6 @@ msgid ""
|
||||
"If the SABnzbd Host or Port is exposed to the internet, your current "
|
||||
"settings allow full external access to the SABnzbd interface."
|
||||
msgstr ""
|
||||
"Wenn der SABnzbd Host oder Port im Netz freigegeben ist, lassen die "
|
||||
"gegenwärtigen Einstellung vollen zugriff auf die SABnzbd Oberfläche zu."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Security"
|
||||
@@ -3600,7 +3599,7 @@ msgstr ""
|
||||
"Die Performanz verbessern, indem eine schwächere SSL-Verschlüsselung "
|
||||
"erzwungen wird."
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Maximale Wiederholungen"
|
||||
|
||||
@@ -3881,7 +3880,7 @@ msgstr "Höchstens"
|
||||
|
||||
#: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Season/Episode"]
|
||||
msgid "From SxxEyy"
|
||||
msgstr "Von SxxEyy"
|
||||
msgstr "Von SxxExx"
|
||||
|
||||
#: sabnzbd/skintext.py [Config->RSS filter-type selection menu "From Show Season/Episode"]
|
||||
msgid "From Show SxxEyy"
|
||||
@@ -4085,22 +4084,6 @@ msgstr "Gerät(e)"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "Geräte, welche die Nachrichten empfangen sollen"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr "Wie oft die selbe benachrichtigung (in Sekunden) geschickt wird."
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4523,10 +4506,6 @@ msgstr ""
|
||||
msgid "WARNING:"
|
||||
msgstr "WARNUNG:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Abrufen"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Aktualisierungsrate"
|
||||
@@ -4695,12 +4674,6 @@ msgstr "Anhalten für …"
|
||||
msgid "Refresh"
|
||||
msgstr "Neu laden"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Sortieren nach Alter <small>Älteste→Neuste</small>"
|
||||
@@ -4849,6 +4822,10 @@ msgstr ""
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Aktualisierung durch Mauszeiger verhindern"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Abrufen"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Hochladen"
|
||||
@@ -5119,12 +5096,6 @@ msgstr "Abrufen der URL fehlgeschlagen; %s"
|
||||
#~ msgid "Folder \"%s\" does not exist"
|
||||
#~ msgstr "Ordner \"%s\" existiert nicht"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "SQL-Commit fehlgeschlagen. Beachten Sie das Nachrichtenprotokoll."
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "CRC-Fehler in %s (%s -> %s)"
|
||||
|
||||
#~ msgid "Error: No secondary interface defined."
|
||||
#~ msgstr "Fehler: Keine sekundäre Oberfläche angegeben."
|
||||
|
||||
@@ -5650,9 +5621,6 @@ msgstr "Abrufen der URL fehlgeschlagen; %s"
|
||||
#~ "Benachrichtigung für Nachrichtengruppen aktivieren (keine, eine oder "
|
||||
#~ "mehrere)"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Hauptpaket nicht gefunden …"
|
||||
|
||||
#~ msgid "Initiating restart...<br />"
|
||||
#~ msgstr "Neustart wird durchgeführt …<br />"
|
||||
|
||||
|
||||
@@ -117,5 +117,3 @@ msgstr "unrar binary... NOT found!"
|
||||
msgid "Downloads will not unpacked."
|
||||
msgstr "Downloads will not be unpacked."
|
||||
|
||||
msgid "Seperate multiple URLs by a comma"
|
||||
msgstr "Separate multiple URLs with a comma"
|
||||
|
||||
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-11-20 21:21+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2017-06-22 07:07+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
|
||||
"Language-Team: Spanish <es@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2017-11-21 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 18505)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -399,6 +399,10 @@ msgstr ""
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "Comando SQL ha fallado, vea el registro"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "Compromiso SQL ha fallado, vea el registro"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "No se pudo cerrar el base de datos, vea el registro"
|
||||
@@ -415,6 +419,10 @@ msgstr "Descodificación %s fallo"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "Error CRC en %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Articulo yEnc corrupto en %s"
|
||||
@@ -566,12 +574,6 @@ msgstr "No se pudo cerrar la conexión de correo"
|
||||
msgid "Email succeeded"
|
||||
msgstr "Email exitoso"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "No se ha podido enviar, faltan datos"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "No se pudo encontrar plantillas de email en %s"
|
||||
@@ -739,11 +741,6 @@ msgstr "¡Servidor no definido!"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Parámetro incorrecto"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Atrás"
|
||||
@@ -802,10 +799,6 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "No se puede cambiar los permisos de %s"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Ejecutando script"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -985,7 +978,6 @@ msgstr ""
|
||||
"La verificación PAR ha fallado en %s, ¡aunque el QuickCheck ha sido "
|
||||
"satisfactorio!"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -1014,6 +1006,10 @@ msgstr "[%s] Verificado en %s, todos los archivos correctos"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Verificado en %s, se necesita reparar"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Paquete principal no encontrado..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1125,6 +1121,11 @@ msgstr "Otros mensajes"
|
||||
msgid "Not available"
|
||||
msgstr "No disponible"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "No se ha podido enviar, faltan datos"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "No se pudo enviar el mensaje de Prowl"
|
||||
@@ -1133,7 +1134,7 @@ msgstr "No se pudo enviar el mensaje de Prowl"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Mala respuesta de Pushover (%s): %s"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "No se pudo enviar el mensaje de Pushover"
|
||||
|
||||
@@ -1512,7 +1513,7 @@ msgid ""
|
||||
"SABnzbd is already running."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Error grave"
|
||||
|
||||
@@ -1535,12 +1536,6 @@ msgid ""
|
||||
"size to 4GB"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr "La descarga fallo, solo %s de los %s requeridos estan disponibles"
|
||||
@@ -1569,6 +1564,10 @@ msgstr "Error al renombrar \"%s\" a \"%s\""
|
||||
msgid "Failed to move files"
|
||||
msgstr "Error al mover ficheros"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Ejecutando script"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Ejecutando script de usuario %s"
|
||||
@@ -1589,7 +1588,7 @@ msgstr "Más"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "Error al post-procesar %s (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "ver fichero de log"
|
||||
|
||||
@@ -3521,7 +3520,7 @@ msgstr ""
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Reintentos máximos"
|
||||
|
||||
@@ -4003,22 +4002,6 @@ msgstr "Dispositivo(s)"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "Dispositivo(s) a los que enviar el mensaje"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4435,10 +4418,6 @@ msgstr ""
|
||||
msgid "WARNING:"
|
||||
msgstr "AVISO:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Obtener"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Frecuencia de actualización"
|
||||
@@ -4608,12 +4587,6 @@ msgstr "Pausar durante..."
|
||||
msgid "Refresh"
|
||||
msgstr "Actualizar"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Ordenar por Fecha <small>Más viejo→Más nuevo</small>"
|
||||
@@ -4762,6 +4735,10 @@ msgstr ""
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Bloquear actualizaciones al pasar por encima"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Obtener"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Subir"
|
||||
@@ -5040,15 +5017,9 @@ msgstr "Error al recuperar la URL; %s"
|
||||
#~ msgid "Try again"
|
||||
#~ msgstr "Inténtelo de nuevo"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "Compromiso SQL ha fallado, vea el registro"
|
||||
|
||||
#~ msgid "WARNING: Paused job \"%s\" because of encrypted RAR file"
|
||||
#~ msgstr "NOTICIA: Transferencia \"%s\" pausado por archivo cifrado"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "Error CRC en %s (%s -> %s)"
|
||||
|
||||
#~ msgid "No UNRAR program found, unpacking RAR files is not possible<br />"
|
||||
#~ msgstr ""
|
||||
#~ "Programa Unrar no encontrado, descomprimir de archivos RAR no posible<br />"
|
||||
@@ -5095,9 +5066,6 @@ msgstr "Error al recuperar la URL; %s"
|
||||
#~ msgid "Missing expected file: %s => unrar error?"
|
||||
#~ msgstr "Falta el siguiente archivo: %s => ¿Error al descomprimir?"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Paquete principal no encontrado..."
|
||||
|
||||
#~ msgid "Invalid par2 files, cannot verify or repair"
|
||||
#~ msgstr "Ficheros par2 inválidos, no se puede verificar o reparar"
|
||||
|
||||
|
||||
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-11-20 21:21+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2017-06-22 07:07+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
|
||||
"Language-Team: Finnish <fi@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2017-11-21 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 18505)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:24+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -398,6 +398,10 @@ msgstr ""
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "SQL komento epäonnistui, katso loki"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "SQL muutos epäonnistui, katso loki"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "Tietokannan sulkeminen epäonnistui, katso loki"
|
||||
@@ -414,6 +418,10 @@ msgstr "Kohteen %s dekoodaus epäonnistui"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "CRC virhe tiedostossa %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Huonosti muotoiltu yEnc artikkeli %s"
|
||||
@@ -563,12 +571,6 @@ msgstr "Sähköpostiyhteyden sulkeminen epäonnistui"
|
||||
msgid "Email succeeded"
|
||||
msgstr "Sähköpostitus onnistui"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Ei voida lähettää, vaaditut tiedot ovat puutteelliset"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "Sähköpostipohjia ei löydy hakemistosta %s"
|
||||
@@ -735,11 +737,6 @@ msgstr "Määrittämätön palvelin!"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Virheellinen parametri"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Takaisin"
|
||||
@@ -798,10 +795,6 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "Käyttöoikeuksien muuttaminen epäonnistui kohteelle %s"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Ajetaan skripti"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -978,7 +971,6 @@ msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr ""
|
||||
"Par varmennus epäonnistui kohteessa %s, mutta Pikatarkistus onnistui!"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -1006,6 +998,10 @@ msgstr "[%s] Varmennettiin ajassa %s, kaikki tiedostot kelvollisia"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Varmennetiin ajassa %s, vaatii korjauksen"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Pääpakettia ei löydy..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1115,6 +1111,11 @@ msgstr "Muut viestit"
|
||||
msgid "Not available"
|
||||
msgstr "Ei saatavilla"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Ei voida lähettää, vaaditut tiedot ovat puutteelliset"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Prowl viestin lähetys epäonnistui"
|
||||
@@ -1123,7 +1124,7 @@ msgstr "Prowl viestin lähetys epäonnistui"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Virheellinen vastaus Pushoverilta (%s): %s"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "Pushover viestin lähetys epäonnistui"
|
||||
|
||||
@@ -1500,7 +1501,7 @@ msgid ""
|
||||
"SABnzbd is already running."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Vakava virhe"
|
||||
|
||||
@@ -1522,12 +1523,6 @@ msgid ""
|
||||
"size to 4GB"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr "Lataaminen saattaa epäonnistua, vain %s osaa %s osasta saatavilla"
|
||||
@@ -1556,6 +1551,10 @@ msgstr "Virhe uudelleennimettäessä \"%s\" nimelle \"%s\""
|
||||
msgid "Failed to move files"
|
||||
msgstr "Tiedostojen siirto epäonnistui"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Ajetaan skripti"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Ajetaan käyttäjän skripti %s"
|
||||
@@ -1576,7 +1575,7 @@ msgstr "Lisää"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "Jälkikäsittely epäonnistui kohteelle %s (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "katso lokitiedosto"
|
||||
|
||||
@@ -3510,7 +3509,7 @@ msgstr "SSL-salaus"
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr "Lisää suorituskykyä pakottamalla alhaisempi SSL-suojaustaso."
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Enimmäismäärä uudelleenyrityksille"
|
||||
|
||||
@@ -3988,22 +3987,6 @@ msgstr "Laitteet"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "Laitteet joihin viesti lähetetään"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4426,10 +4409,6 @@ msgstr ""
|
||||
msgid "WARNING:"
|
||||
msgstr "VAROITUS:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Nouda"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Päivitysväli"
|
||||
@@ -4599,12 +4578,6 @@ msgstr "Keskeytä ajaksi..."
|
||||
msgid "Refresh"
|
||||
msgstr "Päivitä"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Järjestä iän mukaan <small>Vanhin→Uusin</small>"
|
||||
@@ -4752,6 +4725,10 @@ msgstr ""
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Estä päivitykset kun hiiri on päällä"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Nouda"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Lähetä"
|
||||
@@ -5014,9 +4991,6 @@ msgstr "NZB tiedostoa ei voida käyttää"
|
||||
msgid "URL Fetching failed; %s"
|
||||
msgstr "Osoitteen nouto epäonnistui; %s"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "CRC virhe tiedostossa %s (%s -> %s)"
|
||||
|
||||
#~ msgid "Folder \"%s\" does not exist"
|
||||
#~ msgstr "Kansiota \"%s\" ei ole olemassa"
|
||||
|
||||
@@ -5130,12 +5104,6 @@ msgstr "Osoitteen nouto epäonnistui; %s"
|
||||
#~ msgid "Remain/Total"
|
||||
#~ msgstr "Jäljellä/Yhteensä"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "SQL muutos epäonnistui, katso loki"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Pääpakettia ei löydy..."
|
||||
|
||||
#~ msgid "No UNRAR program found, unpacking RAR files is not possible<br />"
|
||||
#~ msgstr ""
|
||||
#~ "UNRAR ohjelmaa ei löydy, RAR-tiedostojen purkaminen ei ole mahdollista<br />"
|
||||
|
||||
105
po/main/fr.po
105
po/main/fr.po
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-11-20 21:21+0000\n"
|
||||
"PO-Revision-Date: 2017-11-15 19:29+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2017-09-12 18:26+0000\n"
|
||||
"Last-Translator: Fred <88com88@gmail.com>\n"
|
||||
"Language-Team: French <fr@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2017-11-21 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 18505)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-13 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -419,6 +419,10 @@ msgstr ""
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "Echec de la commande SQL, voir le journal"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "Echec du commit SQL, voir le journal"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "Impossible de fermer la base de données, voir le journal"
|
||||
@@ -435,6 +439,10 @@ msgstr "Échec du décodage de %s"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr "Échec du décodeur : mémoire insuffisante"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "Erreur CRC dans %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Article yEnc mal construit dans %s"
|
||||
@@ -590,12 +598,6 @@ msgstr "Échec de la fermeture de la connexion à la messagerie"
|
||||
msgid "Email succeeded"
|
||||
msgstr "L'envoi de l'e-mail a réussi"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Impossible d'envoyer, données requises manquantes"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "Impossible de trouver les modèles d'email dans %s"
|
||||
@@ -765,13 +767,6 @@ msgstr "Serveur non défini !"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Paramètre incorrect"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
"Le dossier de catégorie ne peut pas être un sous-dossier du dossier de "
|
||||
"téléchargement temporaire."
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Retour"
|
||||
@@ -833,10 +828,6 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "Impossible de changer les permissions pour %s"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Exécution du script"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -1019,7 +1010,6 @@ msgstr ""
|
||||
"Echec de la vérification Par sur %s, mais QuickCheck (vérification rapide) "
|
||||
"réussi !"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -1049,6 +1039,10 @@ msgstr "[%s] Vérifié dans %s, tous les fichiers sont corrects"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Vérifié dans %s, réparation nécessaire"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Paquet principal introuvable..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1164,6 +1158,11 @@ msgstr "Autres messages"
|
||||
msgid "Not available"
|
||||
msgstr "Non disponible"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Impossible d'envoyer, données requises manquantes"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Echec d'envoi du message Prowl"
|
||||
@@ -1172,7 +1171,7 @@ msgstr "Echec d'envoi du message Prowl"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Mauvaise réponse de Pushover (%s) : %s"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "Échec de l'envoi du message Pushover"
|
||||
|
||||
@@ -1555,7 +1554,7 @@ msgstr ""
|
||||
"Impossible de lier le port %s sur %s. Un autre logiciel utilise le port ou "
|
||||
"SABnzbd est déjà en cours d'exécution."
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Erreur fatale"
|
||||
|
||||
@@ -1580,14 +1579,6 @@ msgstr ""
|
||||
"Le système de fichiers du dossier de téléchargements terminés %s est au "
|
||||
"format FAT, limitant la taille maximale d'un fichier à 4 Go"
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
"Le module subprocessww est manquant. Attendez-vous à des problèmes avec les "
|
||||
"noms de fichiers et de répertoires Unicode dans les téléchargements."
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr ""
|
||||
@@ -1618,6 +1609,10 @@ msgstr "Erreur lors du renommage de \"%s\" en \"%s\""
|
||||
msgid "Failed to move files"
|
||||
msgstr "Impossible de déplacer les fichiers"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Exécution du script"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Exécution du script utilisateur %s"
|
||||
@@ -1638,7 +1633,7 @@ msgstr "Plus"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "Échec du post-traitement pour %s (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "voir le journal"
|
||||
|
||||
@@ -3609,7 +3604,7 @@ msgstr "Chiffrements SSL"
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr "Augmenter les performances en forçant un cryptage SSL plus faible."
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Nombre de tentatives maximum"
|
||||
|
||||
@@ -4098,23 +4093,6 @@ msgstr "Appareil(s)"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "Appareil(s) auxquels doivent être envoyés les messages"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr "Nouvelle tentative d'urgence"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr "À quelle fréquence la même notification sera envoyée (en secondes)"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr "Expiration d'urgence"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
"Tenter à nouveau votre notification pendant combien de temps (en secondes)"
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4539,10 +4517,6 @@ msgstr ""
|
||||
msgid "WARNING:"
|
||||
msgstr "AVERTISSEMENT :"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Charger"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Taux de rafraîchissement"
|
||||
@@ -4713,14 +4687,6 @@ msgstr "Mettre en pause pour…"
|
||||
msgid "Refresh"
|
||||
msgstr "Rafraîchir"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
"Tous les noms d'utilisateur, mots de passe et clés API sont automatiquement "
|
||||
"supprimés du journal et de la copie de vos réglages."
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Trier par Age <small>Moins récent→Plus récent</small>"
|
||||
@@ -4869,6 +4835,10 @@ msgstr ""
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Bloquer rafraîchissements au survol"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Charger"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Envoyer"
|
||||
@@ -5134,9 +5104,6 @@ msgstr "Fichier NZB inutilisable"
|
||||
msgid "URL Fetching failed; %s"
|
||||
msgstr "Échec de récupération de l'URL ; %s"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "Erreur CRC dans %s (%s -> %s)"
|
||||
|
||||
#~ msgid "Error: No secondary interface defined."
|
||||
#~ msgstr "Erreur : Pas d'interface secondaire définie."
|
||||
|
||||
@@ -5495,9 +5462,6 @@ msgstr "Échec de récupération de l'URL ; %s"
|
||||
#~ msgid "Show files"
|
||||
#~ msgstr "Afficher les fichiers"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "Echec du commit SQL, voir le journal"
|
||||
|
||||
#~ msgid "Downloaded so far"
|
||||
#~ msgstr "Téléchargé jusqu'à présent"
|
||||
|
||||
@@ -5613,9 +5577,6 @@ msgstr "Échec de récupération de l'URL ; %s"
|
||||
#~ msgid "pyopenssl module missing, please install for https access"
|
||||
#~ msgstr "module pyopenssl manquant, veuillez l'installer pour l'accès HTTPS"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Paquet principal introuvable..."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " SABnzbd needs a free tcp/ip port for its internal web server.<br>\n"
|
||||
|
||||
135
po/main/he.po
135
po/main/he.po
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-11-20 21:21+0000\n"
|
||||
"PO-Revision-Date: 2017-11-15 20:06+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2017-09-11 21:29+0000\n"
|
||||
"Last-Translator: ION IL <Unknown>\n"
|
||||
"Language-Team: Hebrew <he@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2017-11-21 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 18505)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-12 05:29+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -392,6 +392,10 @@ msgstr "מסד-נתונים היסטוריה פגום, נוצר תחליף רי
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "נכשלה, ראה יומן SQL פקודת"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "נכשל, ראה יומן SQL חיוב"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "נכשל בסגירת מסד-נתונים, ראה יומן"
|
||||
@@ -408,6 +412,10 @@ msgstr "נכשל %s פענוח"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr "כישלון מפענח: אין זיכרון"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "%s (%s -> %s)-ב CRC שגיאת"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "%s-נוצר באופן גרוע ב yEnc מאמר"
|
||||
@@ -436,7 +444,7 @@ msgstr "הושלם"
|
||||
|
||||
#: sabnzbd/directunpacker.py # sabnzbd/newsunpack.py
|
||||
msgid "Unpacked %s files/folders in %s"
|
||||
msgstr "פורקו %s קבצים/תיקיות תוך %s"
|
||||
msgstr "%s-פורקו %s קבצים/תיקיות ב"
|
||||
|
||||
#: sabnzbd/directunpacker.py [Warning message]
|
||||
msgid "Direct Unpack was automatically enabled."
|
||||
@@ -447,7 +455,7 @@ msgid ""
|
||||
"Jobs will start unpacking during the downloading to reduce post-processing "
|
||||
"time. Only works for jobs that do not need repair."
|
||||
msgstr ""
|
||||
".עבודות יתחילו להיפרק במהלך ההורדה כדי להפחית זמן בתר-עיבוד. עובד רק עבור "
|
||||
".עבודות יתחילו להיפרק במהלך ההורדה כדי להפחית זמן לאחר-עיבוד. עובד רק עבור "
|
||||
"עבודות שאינן צריכות תיקון"
|
||||
|
||||
#: sabnzbd/dirscanner.py # sabnzbd/dirscanner.py # sabnzbd/dirscanner.py
|
||||
@@ -558,12 +566,6 @@ msgstr "נכשל בסגירת חיבור דוא\"ל"
|
||||
msgid "Email succeeded"
|
||||
msgstr "דוא\"ל הצליח"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "לא ניתן לשלוח, נתונים דרושים חסרים"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "%s-לא ניתן למצוא תבניות דוא\"ל"
|
||||
@@ -727,11 +729,6 @@ msgstr "!שרת בלתי מוגדר"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "משתנה לא נכון"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ".תיקיית מדור אינה יכולה להיות תת-תיקייה של תיקיית ההורדות הזמניות"
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "הקודם"
|
||||
@@ -792,15 +789,11 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "%s לא יכול לשנות הרשאות של"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "מריץ תסריט"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "PostProcessing was aborted (%s)"
|
||||
msgstr "(%s) בתר-עיבוד בוטל"
|
||||
msgstr "(%s) לאחר-עיבוד בוטל"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/skintext.py [PP phase "script"] # sabnzbd/skintext.py
|
||||
#: sabnzbd/skintext.py [Notification Script settings]
|
||||
@@ -971,7 +964,6 @@ msgstr "מתחיל תיקון"
|
||||
msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr "!בעוד שבדיקה זריזה הצליחה ,%s-נכשל ב Par וידוא"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -998,6 +990,10 @@ msgstr "כל הקבצים נכונים ,%s-[%s] וודאו ב"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "תיקון דרוש ,%s-[%s] וודאו ב"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "...חפיסה ראשית לא נמצאה"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1088,7 +1084,7 @@ msgstr "התווסף NZB"
|
||||
|
||||
#: sabnzbd/notifier.py
|
||||
msgid "Post-processing started"
|
||||
msgstr "בתר-עיבוד התחיל"
|
||||
msgstr "לאחר-עיבוד התחיל"
|
||||
|
||||
#: sabnzbd/notifier.py [Notification]
|
||||
msgid "Job finished"
|
||||
@@ -1110,6 +1106,11 @@ msgstr "הודעות אחרות"
|
||||
msgid "Not available"
|
||||
msgstr "לא זמין"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "לא ניתן לשלוח, נתונים דרושים חסרים"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Prowl נכשל בשליחת הודעת"
|
||||
@@ -1118,7 +1119,7 @@ msgstr "Prowl נכשל בשליחת הודעת"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Pushover (%s): %s-תגובה רעה מ"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "pushover נכשל בשליחת הודעת"
|
||||
|
||||
@@ -1490,7 +1491,7 @@ msgstr ""
|
||||
".כבר רץ SABnzbd איזשהי תוכנה אחרת משתמשת בפתחה או %s לא היה ניתן לקשר את "
|
||||
"פתחה %s על"
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "שגיאה חמורה"
|
||||
|
||||
@@ -1514,13 +1515,6 @@ msgstr ""
|
||||
"המגבילה גודל מרבי של קובץ אל 4 ג\"ב ,FAT היא במערכת קבצים %s תיקיית ההורדות "
|
||||
"השלמות"
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
".של קבצים וספריות בהורדות Unicode חסר. צפה לבעיות עם שמות subprocessww פירקן"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr "הורדה עשויה להיכשל, רק %s מתוך %s דרושים זמינים"
|
||||
@@ -1531,7 +1525,7 @@ msgstr "הורדה נכשלה - לא בשרת(ים) שלך"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "No post-processing because of failed verification"
|
||||
msgstr "אין בתר-עיבוד בגלל וידוא כושל"
|
||||
msgstr "אין לאחר-עיבוד בגלל וידוא כושל"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Moving"
|
||||
@@ -1549,6 +1543,10 @@ msgstr "\"%s\" אל \"%s\" שגיאה בשינוי שם"
|
||||
msgid "Failed to move files"
|
||||
msgstr "נכשל בהעברת קבצים"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "מריץ תסריט"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "%s מריץ תסריט משתמש"
|
||||
@@ -1567,9 +1565,9 @@ msgstr "עוד"
|
||||
|
||||
#: sabnzbd/postproc.py [Error message]
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "%s (%s) בתר-עיבוד נכשל עבור"
|
||||
msgstr "%s (%s) לאחר-עיבוד נכשל עבור"
|
||||
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "ראה קובץ יומן"
|
||||
|
||||
@@ -1595,7 +1593,7 @@ msgstr "%s לא יכול ליצור תיקייה סופית"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Post-processing"
|
||||
msgstr "בתר-עיבוד"
|
||||
msgstr "לאחר-עיבוד"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "[%s] No par2 sets"
|
||||
@@ -1831,11 +1829,11 @@ msgstr "השהה הכל"
|
||||
|
||||
#: sabnzbd/skintext.py [#: Config->Scheduler]
|
||||
msgid "Pause post-processing"
|
||||
msgstr "השהה בתר-עיבוד"
|
||||
msgstr "השהה לאחר-עיבוד"
|
||||
|
||||
#: sabnzbd/skintext.py [#: Config->Scheduler]
|
||||
msgid "Resume post-processing"
|
||||
msgstr "המשך בתר-עיבוד"
|
||||
msgstr "המשך לאחר-עיבוד"
|
||||
|
||||
#: sabnzbd/skintext.py [#: Config->Scheduler]
|
||||
msgid "Read RSS feeds"
|
||||
@@ -2969,7 +2967,7 @@ msgid ""
|
||||
"<em>NOTE:</em> Folders will be created automatically when Saving. You may "
|
||||
"use absolute paths to save outside of the default folders."
|
||||
msgstr ""
|
||||
"<em>הערה:</em> תיקיות יווצרו באופן אוטומטי בעת שמירה. אתה יכול להשתמש "
|
||||
"<em>הערה:</em> .תיקיות יווצרו באופן אוטומטי בעת שמירה. אתה יכול להשתמש "
|
||||
"בנתיבים מוחלטים כדי לשמור מחוץ לתיקיות ברירת המחדל"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
@@ -3155,11 +3153,11 @@ msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Post-Process Only Verified Jobs"
|
||||
msgstr "בצע בתר-עיבוד רק על עבודות שוודאו"
|
||||
msgstr "בצע לאחר-עיבוד רק על עבודות שוודאו"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Only perform post-processing on jobs that passed all PAR2 checks."
|
||||
msgstr ".PAR2-בצע בתר-עיבוד רק בעבודות שעברו את כל בדיקות ה"
|
||||
msgstr ".PAR2-בצע לאחר-עיבוד רק בעבודות שעברו את כל בדיקות ה"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Action when encrypted RAR is downloaded"
|
||||
@@ -3286,8 +3284,8 @@ msgid ""
|
||||
"Use temporary names during post processing. Disable when your system doesn't "
|
||||
"handle that properly."
|
||||
msgstr ""
|
||||
".השתמש בשמות זמניים במהלך בתר-עיבוד. השבת כאשר המערכת שלך אינה מתמודדת עם זה "
|
||||
"כראוי"
|
||||
".השתמש בשמות זמניים במהלך לאחר-עיבוד. השבת כאשר המערכת שלך אינה מתמודדת עם "
|
||||
"זה כראוי"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Pre-queue user script"
|
||||
@@ -3379,12 +3377,12 @@ msgstr ".SABnzbd הפעל את דפדפן ברירת המחדל בעת התחל
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Pause Downloading During Post-Processing"
|
||||
msgstr "השהה הורדה במהלך בתר-עיבוד"
|
||||
msgstr "השהה הורדה במהלך לאחר-עיבוד"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"Pauses downloading at the start of post processing and resumes when finished."
|
||||
msgstr ".משהה הורדה בתחילת בתר-עיבוד וממשיך בסיום"
|
||||
msgstr ".משהה הורדה בתחילת לאחר-עיבוד וממשיך בסיום"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Ignore Samples"
|
||||
@@ -3413,7 +3411,7 @@ msgstr "שרת"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Post processing"
|
||||
msgstr "בתר-עיבוד"
|
||||
msgstr "לאחר-עיבוד"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Naming"
|
||||
@@ -3475,7 +3473,7 @@ msgstr "SSL צפני"
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr ".חלש יותר SSL הגבר ביצועים ע\"י אילוץ חוזק הצפנת"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "ניסיונות חוזרים מרביים"
|
||||
|
||||
@@ -3953,22 +3951,6 @@ msgstr "התקן(ים)"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "התקנים אליהם הודעה תישלח"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr "ניסיון חוזר חרום"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr "באיזו תדירות (בשניות) אותה ההתראה תישלח"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr "תפוגת חרום"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr "כמה שניות ההתראה שלך תמשיך להיות מנוסה שוב"
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4386,10 +4368,6 @@ msgstr "!המסך יעלם באופן אוטומטי SABnzbd במקרה של ה
|
||||
msgid "WARNING:"
|
||||
msgstr "אזהרה:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "משוך"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "קצב רענון"
|
||||
@@ -4558,14 +4536,6 @@ msgstr "...השהה למשך"
|
||||
msgid "Refresh"
|
||||
msgstr "רענן"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
".מוסרים באופן אוטומטי מהיומן ומהעותק הכלול של ההגדרות שלך API-כל שמות "
|
||||
"המשתמש, הסיסמאות ומפתחות ה"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "מיין לפי גיל <small>החדש ביותר→הישן ביותר</small>"
|
||||
@@ -4712,6 +4682,10 @@ msgstr "זה ימנע רענון תוכן כשסמן העכבר שלך מרחף
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "חסום רענונים בריחוף"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "משוך"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "העלה"
|
||||
@@ -5017,14 +4991,5 @@ msgstr "%s ;משיכת כתובת נכשלה"
|
||||
#~ msgid "Invalid par2 files, cannot verify or repair"
|
||||
#~ msgstr "בלתי תקפים, לא יכול לוודא או לתקן par2 קבצי"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "%s (%s -> %s)-ב CRC שגיאת"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "...חפיסה ראשית לא נמצאה"
|
||||
|
||||
#~ msgid "It is likely that you are using ZoneAlarm on Vista.<br>"
|
||||
#~ msgstr ".Vista על ZoneAlarm-סביר להניח שאתה משתמש ב<br>"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "נכשל, ראה יומן SQL חיוב"
|
||||
|
||||
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-11-20 21:21+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2017-09-03 14:07+0000\n"
|
||||
"Last-Translator: Steffen Bærø <steffen.baro@gmail.com>\n"
|
||||
"Language-Team: Norwegian Bokmal <nb@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2017-11-21 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 18505)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -394,6 +394,10 @@ msgstr "Skadet historikkdatabase, opprettet ny database"
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "SQL-kommando mislyktes, se logg"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "SQL Innsetting mislyktes, se logg"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "Kunne ikke stenge databasen, se logg"
|
||||
@@ -410,6 +414,10 @@ msgstr "Dekoding av %s mislyktes"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "CRC-feil i %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Feilaktigt utformet yEnc artikkel i %s"
|
||||
@@ -559,12 +567,6 @@ msgstr "Kunne ikke stenge e-post-tilkobling"
|
||||
msgid "Email succeeded"
|
||||
msgstr "E-post sendning lykkes"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Kan ikke sendes, mangler nødvendig data"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "Kan ikke finne e-post-maler i %s"
|
||||
@@ -731,11 +733,6 @@ msgstr "Udefinert server!"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Feil parameter"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Tilbake"
|
||||
@@ -794,10 +791,6 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "Kunne ikke endre rettigheter på %s"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Kjører skript"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -973,7 +966,6 @@ msgstr "Starter reparasjon"
|
||||
msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr "Par verifisering feilet på %s, mens hurtigsjekk var vellykket!"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -1001,6 +993,10 @@ msgstr "[%s] Verifiseing tok %s, alle filer er ok"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Verifisering tok %s, krever reparasjon"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Hovedarkiv mangler..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1111,6 +1107,11 @@ msgstr "Andre meldinger"
|
||||
msgid "Not available"
|
||||
msgstr "Ikke tilgjengelig"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Kan ikke sendes, mangler nødvendig data"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Klarte ikke å sende Prowl melding"
|
||||
@@ -1119,7 +1120,7 @@ msgstr "Klarte ikke å sende Prowl melding"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Ukorrekt svar fra Pushover (%s): %s"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "Klarte ikke å sende pushover-melding"
|
||||
|
||||
@@ -1492,7 +1493,7 @@ msgid ""
|
||||
"SABnzbd is already running."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Kritisk feil"
|
||||
|
||||
@@ -1514,12 +1515,6 @@ msgid ""
|
||||
"size to 4GB"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr "Nedlasting kan feile, kun %s av kravet på %s tilgjengelig"
|
||||
@@ -1548,6 +1543,10 @@ msgstr "Kunne ikke endre navn fra \"%s\" til \"%s\""
|
||||
msgid "Failed to move files"
|
||||
msgstr "Klarte ikke å flytte filer"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Kjører skript"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Kjør brukerskript %s"
|
||||
@@ -1568,7 +1567,7 @@ msgstr "Mer"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "Etterbehandling mislyktes for %s (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "se loggfil"
|
||||
|
||||
@@ -3474,7 +3473,7 @@ msgstr ""
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Maksimum antall forsøk"
|
||||
|
||||
@@ -3948,22 +3947,6 @@ msgstr "Enhet(er)"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "Enhet(er) som meldingen skal sendes til"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4381,10 +4364,6 @@ msgstr ""
|
||||
msgid "WARNING:"
|
||||
msgstr "ADVARSEL:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Hent"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Oppdateringsfrekvens"
|
||||
@@ -4551,12 +4530,6 @@ msgstr "Pause i..."
|
||||
msgid "Refresh"
|
||||
msgstr "Oppdatere"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Sorter etter alder <small>Eldst→Ny</small>"
|
||||
@@ -4703,6 +4676,10 @@ msgstr "Dette vil hindre oppfrisking av innhold når muspekeren er over køen"
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Blokker oppfrisking når musen svever over"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Hent"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Last Opp"
|
||||
@@ -4969,9 +4946,6 @@ msgstr "URL henting mislyktes; %s"
|
||||
#~ msgid "Folder \"%s\" does not exist"
|
||||
#~ msgstr "Mappen \"%s\" finnes ikke"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "SQL Innsetting mislyktes, se logg"
|
||||
|
||||
#~ msgid "No UNRAR program found, unpacking RAR files is not possible<br />"
|
||||
#~ msgstr "Kunne ikke finne noen UNRAR program, utpakking er ikke mulig<br />"
|
||||
|
||||
@@ -5017,9 +4991,6 @@ msgstr "URL henting mislyktes; %s"
|
||||
#~ msgid "Unpacking failed, an expected file was not unpacked"
|
||||
#~ msgstr "Utpakking mislyktes, en forventet fil er ikke utpakket"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Hovedarkiv mangler..."
|
||||
|
||||
#~ msgid "Error importing OpenSSL module. Connecting with NON-SSL"
|
||||
#~ msgstr "Mislyktes med importering av OpenSSL modul. Kobler til uten SSL"
|
||||
|
||||
@@ -5351,9 +5322,6 @@ msgstr "URL henting mislyktes; %s"
|
||||
#~ msgid "WARNING: Paused job \"%s\" because of encrypted RAR file"
|
||||
#~ msgstr "ADVARSEL: Jobb \"%s\" satt på pause pga. kryptert RAR-fil"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "CRC-feil i %s (%s -> %s)"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Your UNRAR version is not recommended, get it from "
|
||||
#~ "http://www.rarlab.com/rar_add.htm<br />"
|
||||
|
||||
102
po/main/nl.po
102
po/main/nl.po
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-11-20 21:21+0000\n"
|
||||
"PO-Revision-Date: 2017-11-01 09:08+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2017-09-11 07:07+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
|
||||
"Language-Team: Dutch <nl@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2017-11-21 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 18505)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-12 05:29+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -412,6 +412,10 @@ msgstr ""
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "SQL-commando mislukt, zie logbestand"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "SQL-opslagopdracht mislukt, zie logbestand"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "Het lukt niet om de database te sluiten, zie log"
|
||||
@@ -428,6 +432,10 @@ msgstr "Decoderen van %s mislukt"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr "Decoder fout: onvoldoende geheugen"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "CRC-fout in %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Slecht opgemaakt yEnc-artikel in %s"
|
||||
@@ -581,12 +589,6 @@ msgstr "Beëindigen e-mailverbinding mislukt"
|
||||
msgid "Email succeeded"
|
||||
msgstr "E-mail verzonden"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Versturen kan niet, vereiste gegevens ontbreken"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "Geen e-mailsjablonen te vinden in %s"
|
||||
@@ -754,13 +756,6 @@ msgstr "Onbekende server."
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Incorrecte parameter"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
"Een Categorie specifieke map mag niet een map in de Tijdelijke download map "
|
||||
"zijn."
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Terug"
|
||||
@@ -822,10 +817,6 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "Toegangsrechten van %s niet aan te passen"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Script uitvoeren"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -1001,7 +992,6 @@ msgstr "Reparatie starten"
|
||||
msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr "Par-verificatie van %s misgelukt, maar QuickCheck wel gelukt."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -1029,6 +1019,10 @@ msgstr "[%s] %s geverifieerd, alle bestanden zijn goed"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Geverifieerd in %s, reparatie is nodig"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Hoofdpakket niet gevonden..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1143,6 +1137,11 @@ msgstr "Andere berichten"
|
||||
msgid "Not available"
|
||||
msgstr "Niet beschikbaar"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Versturen kan niet, vereiste gegevens ontbreken"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Verzenden van Prowl-bericht mislukt"
|
||||
@@ -1151,7 +1150,7 @@ msgstr "Verzenden van Prowl-bericht mislukt"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Slecht antwoord van Pushover (%s): %s"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "Pushover-bericht sturen mislukt"
|
||||
|
||||
@@ -1526,7 +1525,7 @@ msgstr ""
|
||||
"Kan niet binden aan poort %s van %s. Andere software gebruikt deze poort of "
|
||||
"SABnzbd is al actief."
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Fatale fout"
|
||||
|
||||
@@ -1550,14 +1549,6 @@ msgstr ""
|
||||
"De map voor voltooide downloads %s staat op een FAT systeem, de maximale "
|
||||
"file omvang is dan maar 4G"
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
"De module subprocessww ontbreekt. Je kunt problemen krijgen met Unicode "
|
||||
"namen van bestanden en mappen."
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr ""
|
||||
@@ -1587,6 +1578,10 @@ msgstr "Fout bij hernoemen van \"%s\" tot \"%s\""
|
||||
msgid "Failed to move files"
|
||||
msgstr "Verplaatsen van bestanden mislukt"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Script uitvoeren"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Gebruiker script %s loopt"
|
||||
@@ -1607,7 +1602,7 @@ msgstr "Meer"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "Nabewerking van %s mislukt (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "zie logbestand"
|
||||
|
||||
@@ -3555,7 +3550,7 @@ msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr ""
|
||||
"Verhoog de prestaties door een eenvoudigere SSL versleuteling toe te passen."
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Maximum aantal pogingen"
|
||||
|
||||
@@ -4045,22 +4040,6 @@ msgstr "Apparaten"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "Apparaat of apparaten die het bericht moeten ontvangen"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr "Noodgeval herhaling"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr "Hoevaak moet de notification herhaald worden (in seconden)"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr "Einde van noodgeval"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr "Hoeveel seconden moet de notificatie herhaald worden"
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4482,10 +4461,6 @@ msgstr "Wanneer SABnzbd opnieuw is gestart, gaat dit venster vanzelf weg!"
|
||||
msgid "WARNING:"
|
||||
msgstr "WAARSCHUWING:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Ophalen"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Ververssnelheid"
|
||||
@@ -4654,12 +4629,6 @@ msgstr "Pauzeer..."
|
||||
msgid "Refresh"
|
||||
msgstr "Ververs"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Sorteer op Leeftijd <small>Oud→Nieuw</small>"
|
||||
@@ -4807,6 +4776,10 @@ msgstr ""
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Geen verversing bij popups"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Ophalen"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Ophalen"
|
||||
@@ -5114,9 +5087,6 @@ msgstr "URL ophalen mislukt; %s"
|
||||
#~ msgid "pyopenssl module missing, please install for https access"
|
||||
#~ msgstr "Module \"pyopenssl\" ontbreekt, geen HTTPS mogelijk"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Hoofdpakket niet gevonden..."
|
||||
|
||||
#~ msgid "Failed to remove nzo from postproc queue (id)"
|
||||
#~ msgstr "Verwijderen van nzo van nabewerkingswachtrij mislukt"
|
||||
|
||||
@@ -5601,12 +5571,6 @@ msgstr "URL ophalen mislukt; %s"
|
||||
#~ msgstr ""
|
||||
#~ "WAARSCHUWING: Taak '%s' is afgebroken vanwege een versleuteld RAR-bestand"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "CRC-fout in %s (%s -> %s)"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "SQL-opslagopdracht mislukt, zie logbestand"
|
||||
|
||||
#~ msgid "No UNRAR program found, unpacking RAR files is not possible<br />"
|
||||
#~ msgstr ""
|
||||
#~ "Geen UNRAR-programma gevonden, uitpakken van RAR-bestanden niet mogelijk<br "
|
||||
|
||||
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-11-20 21:21+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2015-12-28 10:22+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
|
||||
"Language-Team: Polish <pl@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2017-11-21 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 18505)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -394,6 +394,10 @@ msgstr "Uszkodzona baza danych historii, utworzono w jej miejscu nową, pustą"
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "Błąd polecenia SQL, sprawdź logi"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "Błąd wykonania polecenia SQL, sprawdź logi"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "Błąd zamykania bazy danych, sprawdź logi"
|
||||
@@ -410,6 +414,10 @@ msgstr "Błąd dekodowania %s"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "Błąd CRC w %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Źle zbudowany artykuł yEnc w %s"
|
||||
@@ -561,12 +569,6 @@ msgstr "Nie udało się zamknąć połączenia z serwerem pocztowym"
|
||||
msgid "Email succeeded"
|
||||
msgstr "Wiadomość wysłana"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Nie można wysłać wiadomości, brak wymaganych danych"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "Brak szablonów wiadomości email w %s"
|
||||
@@ -734,11 +736,6 @@ msgstr "Niezdefiniowany serwer!"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Błędny parametr"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Powrót"
|
||||
@@ -797,10 +794,6 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "Nie można zmienić uprawnień %s"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Uruchamianie skryptu"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -976,7 +969,6 @@ msgstr "Rozpoczynanie naprawy"
|
||||
msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr "Weryfikacja %s nieudana, choć szybkie sprawdzenie powiodło się!"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -1005,6 +997,10 @@ msgstr "[%s] Zweryfikowano w %s, wszystkie pliki prawidłowe"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Zweryfikowano w %s, wymagana naprawa"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Główny pakiet nieznaleziony..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1116,6 +1112,11 @@ msgstr "Inne komunikaty"
|
||||
msgid "Not available"
|
||||
msgstr "Niedostępne"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Nie można wysłać wiadomości, brak wymaganych danych"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Błąd wysyłania wiadomości Prowl"
|
||||
@@ -1124,7 +1125,7 @@ msgstr "Błąd wysyłania wiadomości Prowl"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Zła odpowiedź od Pushover (%s): %s"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "Nie udało się wysłać wiadomości Pushover"
|
||||
|
||||
@@ -1498,7 +1499,7 @@ msgid ""
|
||||
"SABnzbd is already running."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Błąd krytyczny"
|
||||
|
||||
@@ -1521,12 +1522,6 @@ msgid ""
|
||||
"size to 4GB"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr "Pobieranie może się nie udać, dostępne jedynie %s z wymaganych %s"
|
||||
@@ -1556,6 +1551,10 @@ msgstr "Błąd zmiany nazwy \"%s\" na \"%s\""
|
||||
msgid "Failed to move files"
|
||||
msgstr "Nie udało się przenieść plików"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Uruchamianie skryptu"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Uruchamianie skryptu użytkownika %s"
|
||||
@@ -1576,7 +1575,7 @@ msgstr "Więcej"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "Przetwarzanie końcowe nie powiodło się dla %s (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "sprawdź logi"
|
||||
|
||||
@@ -3491,7 +3490,7 @@ msgstr ""
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Maksymalna ilość prób"
|
||||
|
||||
@@ -3966,22 +3965,6 @@ msgstr "Urządzenie(-a)"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "Urządzenie(-a), do którego(-ych) mają być wysyłane powiadomienia"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4399,10 +4382,6 @@ msgstr ""
|
||||
msgid "WARNING:"
|
||||
msgstr "UWAGA:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Pobierz"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Częstotliwość odświeżania"
|
||||
@@ -4569,12 +4548,6 @@ msgstr "Wstrzymaj na..."
|
||||
msgid "Refresh"
|
||||
msgstr "Odśwież"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Sortuj według wieku <small>Najstarsze→Najnowsze</small>"
|
||||
@@ -4721,6 +4694,10 @@ msgstr "Blokuje odświeżanie zawartości po najechaniu kursorem na kolejkę"
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Zablokuj odświeżanie podczas wskazywania"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Pobierz"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Wczytaj"
|
||||
@@ -4982,9 +4959,6 @@ msgstr "Bezużyteczny plik NZB"
|
||||
msgid "URL Fetching failed; %s"
|
||||
msgstr "Pobieranie URL nie powiodło się; %s"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "Błąd CRC w %s (%s -> %s)"
|
||||
|
||||
#~ msgid "Folder \"%s\" does not exist"
|
||||
#~ msgstr "Folder \"%s\" nie istnieje"
|
||||
|
||||
@@ -5001,9 +4975,6 @@ msgstr "Pobieranie URL nie powiodło się; %s"
|
||||
#~ msgid "Downloaded so far"
|
||||
#~ msgstr "Dotychczas pobrano"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "Błąd wykonania polecenia SQL, sprawdź logi"
|
||||
|
||||
#~ msgid "Not matched"
|
||||
#~ msgstr "Nie dopasowano"
|
||||
|
||||
@@ -5283,9 +5254,6 @@ msgstr "Pobieranie URL nie powiodło się; %s"
|
||||
#~ msgid "Missing expected file: %s => unrar error?"
|
||||
#~ msgstr "Brak oczekiwanego pliku: %s => błąd rozpakowywania archiwum RAR?"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Główny pakiet nieznaleziony..."
|
||||
|
||||
#~ msgid "Error importing OpenSSL module. Connecting with NON-SSL"
|
||||
#~ msgstr "Błąd importu modułu OpenSSL. Łączenie bez SSL"
|
||||
|
||||
|
||||
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-11-20 21:21+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2016-01-01 22:58+0000\n"
|
||||
"Last-Translator: lrrosa <Unknown>\n"
|
||||
"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2017-11-21 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 18505)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -396,6 +396,10 @@ msgstr "Dados de histórico danificados, criado um substituto vazio"
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "O comando SQL falhou. Consulte o log"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "O commit do SQL falhou. Consulte o log"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "Falha ao fechar o banco de dados. Consulte o log"
|
||||
@@ -412,6 +416,10 @@ msgstr "Falha ao decodificar %s"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "Erro de CRC em %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Artigo yEnc mal formado em %s"
|
||||
@@ -562,12 +570,6 @@ msgstr "Falha ao fechar a conexão de e-mail"
|
||||
msgid "Email succeeded"
|
||||
msgstr "E-mail enviado com sucesso"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Não foi possível enviar, faltam dados obrigatórios"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "Não é possível encontrar modelos de e-mail em %s"
|
||||
@@ -734,11 +736,6 @@ msgstr "Servidor não definido!"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Parâmetro incorreto"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Voltar"
|
||||
@@ -797,10 +794,6 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "Não é possível alterar permissões de %s"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Executando script"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -976,7 +969,6 @@ msgstr "Iniciando reparação"
|
||||
msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr "Validação de par falhou em %s, enquanto QuickCheck foi completo!"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -1004,6 +996,10 @@ msgstr "[%s] Verificado em %s. Todos os arquivos corretos"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Verificado em %s. É necessário reparar"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Pacote principal não encontrado..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1113,6 +1109,11 @@ msgstr "Outras Mensagens"
|
||||
msgid "Not available"
|
||||
msgstr "Não disponível"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Não foi possível enviar, faltam dados obrigatórios"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Falha ao enviar mensagem Prowl"
|
||||
@@ -1121,7 +1122,7 @@ msgstr "Falha ao enviar mensagem Prowl"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Resposta incorreta do Pushover (%s): %s"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "Falha ao enviar mensagem pushover"
|
||||
|
||||
@@ -1497,7 +1498,7 @@ msgid ""
|
||||
"SABnzbd is already running."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Erro fatal"
|
||||
|
||||
@@ -1519,12 +1520,6 @@ msgid ""
|
||||
"size to 4GB"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr ""
|
||||
@@ -1554,6 +1549,10 @@ msgstr "Erro ao renomear \"%s\" para \"%s\""
|
||||
msgid "Failed to move files"
|
||||
msgstr "Falha ao mover arquivos"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Executando script"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Executando script de usuário %s"
|
||||
@@ -1574,7 +1573,7 @@ msgstr "Mais"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "O pós-processamento falhou para %s (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "veja o arquivo de log"
|
||||
|
||||
@@ -3488,7 +3487,7 @@ msgstr ""
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Máximo de tentativas"
|
||||
|
||||
@@ -3964,22 +3963,6 @@ msgstr "Dispositivo(s)"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "Dispositivo(s) para qual a mensagem deve ser enviada"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4397,10 +4380,6 @@ msgstr ""
|
||||
msgid "WARNING:"
|
||||
msgstr "AVISO:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Obter"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Taxa de atualização"
|
||||
@@ -4567,12 +4546,6 @@ msgstr "Pausar por..."
|
||||
msgid "Refresh"
|
||||
msgstr "Atualizar"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Ordenar por Idade <small>Mais antigo→Mais novo</small>"
|
||||
@@ -4721,6 +4694,10 @@ msgstr ""
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Impedir Atualizações no Foco"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Obter"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Enviar"
|
||||
@@ -4987,15 +4964,9 @@ msgstr "A busca da URL falhou; %s"
|
||||
#~ msgstr ""
|
||||
#~ "ATENÇÃO: Tarefa \"%s\" em pausa por causa de arquivo RAR criptografado"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "Erro de CRC em %s (%s -> %s)"
|
||||
|
||||
#~ msgid "Folder \"%s\" does not exist"
|
||||
#~ msgstr "A pasta \"%s\" não existe"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "O commit do SQL falhou. Consulte o log"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Your UNRAR version is not recommended, get it from "
|
||||
#~ "http://www.rarlab.com/rar_add.htm<br />"
|
||||
@@ -5048,9 +5019,6 @@ msgstr "A busca da URL falhou; %s"
|
||||
#~ msgid "Missing expected file: %s => unrar error?"
|
||||
#~ msgstr "Faltando arquivo esperado: %s => erro no unrar?"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Pacote principal não encontrado..."
|
||||
|
||||
#~ msgid "Invalid par2 files, cannot verify or repair"
|
||||
#~ msgstr "Arquivos PAR2 inválidos. Não é possível verificar ou reparar"
|
||||
|
||||
|
||||
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-11-20 21:21+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2016-07-29 16:20+0000\n"
|
||||
"Last-Translator: nicusor <Unknown>\n"
|
||||
"Language-Team: Romanian <ro@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2017-11-21 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 18505)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -398,6 +398,10 @@ msgstr "Bază de date Istoric coruptă, creat un nou fişier gol"
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "Comandă SQL Nereuşită, vedeţi jurnal"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "Modificare SQL Nereuşită, vedeţi jurnal"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "Închidere bază de date nereuşită, vedeţi jurnal"
|
||||
@@ -414,6 +418,10 @@ msgstr "Decodarea %s nereuşită"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "Eroare CRC în %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Articoul yEnc invalid în %s"
|
||||
@@ -564,12 +572,6 @@ msgstr "Închidere conexiune mail nereuşită"
|
||||
msgid "Email succeeded"
|
||||
msgstr "Email reuşit"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Nu pot trimite, informații necesare lipsă"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "Nu pot gasi şabloane email în %s"
|
||||
@@ -737,11 +739,6 @@ msgstr "Server nedefinit!"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Parametru Incorect"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Înapoi"
|
||||
@@ -800,10 +797,6 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "Nu pot schimba permisiunile lui %s"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Rulare script"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -979,7 +972,6 @@ msgstr "Pornire Reparare"
|
||||
msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr "Verificarea Par eșuată pentru %s, dar VerificareaRapidă reușită!"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -1008,6 +1000,10 @@ msgstr "[%s] Verificat în %s, toate fişierele sunt corecte"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Verificat în %s, reparare necesară"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Pachet principal negăsit..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1117,6 +1113,11 @@ msgstr "Alte Mesaje"
|
||||
msgid "Not available"
|
||||
msgstr "Indisponibil"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Nu pot trimite, informații necesare lipsă"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Nu am putu trimite mesajul Prowl"
|
||||
@@ -1125,7 +1126,7 @@ msgstr "Nu am putu trimite mesajul Prowl"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Răspuns greșit de la Pushover (%s): %s"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "Nu am putut trimite mesajul de pushover"
|
||||
|
||||
@@ -1504,7 +1505,7 @@ msgid ""
|
||||
"SABnzbd is already running."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Eroare fatală"
|
||||
|
||||
@@ -1526,12 +1527,6 @@ msgid ""
|
||||
"size to 4GB"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr "Descărcarea ar putea eşua, doar %s din %s disponibil"
|
||||
@@ -1560,6 +1555,10 @@ msgstr "Eroare redenumire \"%s\" în \"%s\""
|
||||
msgid "Failed to move files"
|
||||
msgstr "Nu am putu muta fişier"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Rulare script"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Rulare script utilizator %s"
|
||||
@@ -1580,7 +1579,7 @@ msgstr "Mai mult"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "Post Procesare Nereuşită pentru %s (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "vezi fişier jurnal"
|
||||
|
||||
@@ -3490,7 +3489,7 @@ msgstr ""
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Număr Maxim reîncercări"
|
||||
|
||||
@@ -3969,22 +3968,6 @@ msgstr "Dispozitiv(e)"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "Dispozitiv(e) la care să se trimită mesajul"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4400,10 +4383,6 @@ msgstr "În cazul repornirii SABnzbd acest ecran va dispărea în mod automat!"
|
||||
msgid "WARNING:"
|
||||
msgstr "ATENŢIE:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Descarcă"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Rată actualizare"
|
||||
@@ -4572,12 +4551,6 @@ msgstr "Pauză timp de..."
|
||||
msgid "Refresh"
|
||||
msgstr "Reîmprospătează"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Sortează după Vârstă <small>Cel mai Vechi→Cel mai Nou</small>"
|
||||
@@ -4726,6 +4699,10 @@ msgstr ""
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Blochează Reîmprospătarea Hover"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Descarcă"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Încarcă"
|
||||
@@ -4992,15 +4969,9 @@ msgstr "Descărcare URL nereuşită; %s"
|
||||
#~ msgstr ""
|
||||
#~ "ATENŢIE: Sarcina \"%s\" întreruptă din cauza fişierelor RAR encriptate"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "Eroare CRC în %s (%s -> %s)"
|
||||
|
||||
#~ msgid "Folder \"%s\" does not exist"
|
||||
#~ msgstr "Dosarul \"%s\" nu există"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "Modificare SQL Nereuşită, vedeţi jurnal"
|
||||
|
||||
#~ msgid "No UNRAR program found, unpacking RAR files is not possible<br />"
|
||||
#~ msgstr ""
|
||||
#~ "Nici un program UNRAR găsit, dezarhivarea fişierelor RAR imposibilă<br />"
|
||||
@@ -5082,9 +5053,6 @@ msgstr "Descărcare URL nereuşită; %s"
|
||||
#~ msgid "Missing expected file: %s => unrar error?"
|
||||
#~ msgstr "Fişiere aşteptate lipsă: %s => eroare unrar?"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Pachet principal negăsit..."
|
||||
|
||||
#~ msgid "Error importing OpenSSL module. Connecting with NON-SSL"
|
||||
#~ msgstr "Eroare importare modul OpenSSL . Se conectează folosind NON-SSL"
|
||||
|
||||
|
||||
@@ -2,15 +2,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SABnzbd-0.7.x\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-11-20 21:21+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2013-05-05 14:50+0000\n"
|
||||
"Last-Translator: Pavel Maryanov <Unknown>\n"
|
||||
"Language-Team: Russian <gmu@mx.ru>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2017-11-21 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 18505)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
"Generated-By: pygettext.py 1.5\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
@@ -387,6 +387,10 @@ msgstr ""
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "Ошибка команды SQL (см. журнал)"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "Ошибка фиксации SQL (см. журнал)"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "Не удалось закрыть базу данных (см. журнал)"
|
||||
@@ -403,6 +407,10 @@ msgstr "Ошибка декодирования %s"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "Ошибка CRC в %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Неверно сформированная статья yEnc в %s"
|
||||
@@ -551,12 +559,6 @@ msgstr "Не удалось разорвать соединение с почт
|
||||
msgid "Email succeeded"
|
||||
msgstr "Электронное письмо успешно отправлено"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "Не удаётся найти шаблонны электронных писем в %s"
|
||||
@@ -724,11 +726,6 @@ msgstr ""
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Неправильный параметр"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Назад"
|
||||
@@ -787,10 +784,6 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "Не удаётся изменить права доступа %s"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Запуск сценария"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -966,7 +959,6 @@ msgstr "запуск исправления"
|
||||
msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -995,6 +987,10 @@ msgstr "[%s] Проверено за %s. Ошибок нет"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Проверено за %s. Требуется исправление"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Главный пакет не найден..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1105,6 +1101,11 @@ msgstr "Другие сообщения"
|
||||
msgid "Not available"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr ""
|
||||
@@ -1113,7 +1114,7 @@ msgstr ""
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr ""
|
||||
|
||||
@@ -1490,7 +1491,7 @@ msgid ""
|
||||
"SABnzbd is already running."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Критическая ошибка"
|
||||
|
||||
@@ -1512,12 +1513,6 @@ msgid ""
|
||||
"size to 4GB"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr ""
|
||||
@@ -1546,6 +1541,10 @@ msgstr "Ошибка переименования «%s» и «%s»"
|
||||
msgid "Failed to move files"
|
||||
msgstr "Не удалось переместить файлы"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Запуск сценария"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Запуск пользовательского сценария %s"
|
||||
@@ -1566,7 +1565,7 @@ msgstr "Подробнее"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "Ошибка пост-обработки для %s (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "см. журнал"
|
||||
|
||||
@@ -3467,7 +3466,7 @@ msgstr ""
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Число попыток"
|
||||
|
||||
@@ -3947,22 +3946,6 @@ msgstr ""
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr ""
|
||||
@@ -4378,10 +4361,6 @@ msgstr ""
|
||||
msgid "WARNING:"
|
||||
msgstr "ПРЕДУПРЕЖДЕНИЕ"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Загрузить"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Частота обновления"
|
||||
@@ -4548,12 +4527,6 @@ msgstr "Приостановить на..."
|
||||
msgid "Refresh"
|
||||
msgstr "Обновить"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Сортировать по возрасту <small>от старых к новым</small>"
|
||||
@@ -4702,6 +4675,10 @@ msgstr ""
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Блокировать обновление при наведении мыши"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Загрузить"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Отправить"
|
||||
@@ -4973,12 +4950,6 @@ msgstr "Не удалось загрузить URL: %s"
|
||||
#~ msgid "Folder \"%s\" does not exist"
|
||||
#~ msgstr "Папка «%s» не существует"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "Ошибка фиксации SQL (см. журнал)"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "Ошибка CRC в %s (%s -> %s)"
|
||||
|
||||
#~ msgid "Error: No secondary interface defined."
|
||||
#~ msgstr "Ошибка: дополнительный интерфейс не определён."
|
||||
|
||||
@@ -5036,9 +5007,6 @@ msgstr "Не удалось загрузить URL: %s"
|
||||
#~ msgid "Unpacking failed, these file(s) are missing:"
|
||||
#~ msgstr "Ошибка распаковки: отсутствуют следующие файлы:"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Главный пакет не найден..."
|
||||
|
||||
#~ msgid "Invalid par2 files, cannot verify or repair"
|
||||
#~ msgstr "Недопустимые PAR2-файлы. Нельзя выполнить проверку или исправление"
|
||||
|
||||
|
||||
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: ОZZII <ozzii.translate@gmail.com>\n"
|
||||
"POT-Creation-Date: 2017-11-20 21:21+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2015-12-28 10:25+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
|
||||
"Language-Team: Serbian <sr@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2017-11-21 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 18505)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -391,6 +391,10 @@ msgstr "Baza dnevnika je oštećena, kreirana prazna zamena"
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "Neuspešna SQL komanda, videti izveštaj"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "Погрешно SQL извршавање, видети извештај"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "Неуспешно затварање базе, видети извештај"
|
||||
@@ -407,6 +411,10 @@ msgstr "Dešifrovanje %s neuspešno"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "CRC грешка у %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Лоше формиран yEnc артикал у %s"
|
||||
@@ -556,12 +564,6 @@ msgstr "Неуспешно затварање везе е-поште"
|
||||
msgid "Email succeeded"
|
||||
msgstr "Упешно слање е-поште"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Nemoguće poslati, nedostaju obavezni podaci"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "Немогуће наћи модел е-поруке у %s"
|
||||
@@ -726,11 +728,6 @@ msgstr "Server nije definisan!"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Погрешан параметар"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Назад"
|
||||
@@ -789,10 +786,6 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "Не може да се промене дозволе од %s"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Покретање скрипта"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -968,7 +961,6 @@ msgstr "Покретање пооправљања"
|
||||
msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr "Par provera neuspešna na %s, dok je QuickCheck uspešan!"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -997,6 +989,10 @@ msgstr "[%s] Проверено за %s, све датотеке су добре
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Проверено за %s, потребна је поправка"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Главни пакет није нађен..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1106,6 +1102,11 @@ msgstr "Остале поруке"
|
||||
msgid "Not available"
|
||||
msgstr "Недоступно"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Nemoguće poslati, nedostaju obavezni podaci"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Неуспешно слање Prowl поруке"
|
||||
@@ -1114,7 +1115,7 @@ msgstr "Неуспешно слање Prowl поруке"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Neodgovarajući odgovor od strane Pushover (%s): %s"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "Neuspešno slanje Pushover poruke"
|
||||
|
||||
@@ -1484,7 +1485,7 @@ msgid ""
|
||||
"SABnzbd is already running."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Фатална грешка"
|
||||
|
||||
@@ -1506,12 +1507,6 @@ msgid ""
|
||||
"size to 4GB"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr "Преузимање је можда погрешно. има %s од потребних %s"
|
||||
@@ -1540,6 +1535,10 @@ msgstr "Грешка преименовања \"%s\" у \"%s\""
|
||||
msgid "Failed to move files"
|
||||
msgstr "Неуспешно премештање датотека"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Покретање скрипта"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Покретање скрипта %s"
|
||||
@@ -1560,7 +1559,7 @@ msgstr "Више"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "Грешка пост-процесирања за %s (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "видети извештај"
|
||||
|
||||
@@ -3459,7 +3458,7 @@ msgstr ""
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Макс покушаја"
|
||||
|
||||
@@ -3933,22 +3932,6 @@ msgstr "Uređaj(i)"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "Uređaj(i) na koje bi poruke trebale biti poslate"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4365,10 +4348,6 @@ msgstr ""
|
||||
msgid "WARNING:"
|
||||
msgstr "ПАЖЊА:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Преузми"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Брзина освежавања"
|
||||
@@ -4535,12 +4514,6 @@ msgstr "Паузирај за..."
|
||||
msgid "Refresh"
|
||||
msgstr "Освежи"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Среди по старост <small>Старије→Новије</small>"
|
||||
@@ -4687,6 +4660,10 @@ msgstr "При прелазу миша преко рада, зауставља
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Блокирати обнове на прелаз миша"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Преузми"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Слање"
|
||||
@@ -5221,12 +5198,6 @@ msgstr "Погрешно учитавање УРЛ-а; %s"
|
||||
#~ msgid "Folder \"%s\" does not exist"
|
||||
#~ msgstr "фасцикла \"%s\" не постоји"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "Погрешно SQL извршавање, видети извештај"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "CRC грешка у %s (%s -> %s)"
|
||||
|
||||
#~ msgid "Not matched"
|
||||
#~ msgstr "Не одговара"
|
||||
|
||||
@@ -5276,9 +5247,6 @@ msgstr "Погрешно учитавање УРЛ-а; %s"
|
||||
#~ msgid "Unpacking failed, these file(s) are missing:"
|
||||
#~ msgstr "Неуспешан издвој, ове датотеке недостају:"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Главни пакет није нађен..."
|
||||
|
||||
#~ msgid "KB/s"
|
||||
#~ msgstr "КБ/с"
|
||||
|
||||
|
||||
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-11-20 21:21+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2016-02-20 20:34+0000\n"
|
||||
"Last-Translator: shypike <Unknown>\n"
|
||||
"Language-Team: Swedish <sv@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2017-11-21 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 18505)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -392,6 +392,10 @@ msgstr "Skadad hitsotrikdatabas, skapade en tom ersättare"
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "SQL Kommando misslyckades, se logg"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "SQL Commit misslyckades, se logg"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "Det gick inte att stänga databasen, se logg"
|
||||
@@ -408,6 +412,10 @@ msgstr "Avkodning av %s misslyckades"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "CRC Fel i %s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "Felaktigt utformad yEnc artikel i %s"
|
||||
@@ -556,12 +564,6 @@ msgstr "Det gick inte att stänga e-mail anslutning"
|
||||
msgid "Email succeeded"
|
||||
msgstr "E-mail sändning lyckades"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Kunde inte skicka, saknar nödvändig data"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "Kan ej finna e-mail mallar i %s"
|
||||
@@ -730,11 +732,6 @@ msgstr "Odefinerad server!"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "Fel parameter"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "Bakåt"
|
||||
@@ -793,10 +790,6 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "Det gick inte att ändra rättigheter på %s"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Kör skript"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -972,7 +965,6 @@ msgstr "Startar reparation"
|
||||
msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr "Par verifiering misslyckades på %s, medans QuickCheck lyckades!"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -1001,6 +993,10 @@ msgstr "[%s] Verifierad i %s, alla filer är ok"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] Verifiering i %s, kräver reparation"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "Huvudarkiv saknas..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1111,6 +1107,11 @@ msgstr "Andra meddelanden"
|
||||
msgid "Not available"
|
||||
msgstr "Ej tillgänglig"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "Kunde inte skicka, saknar nödvändig data"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "Misslyckades att skicka Prowlmeddelande"
|
||||
@@ -1119,7 +1120,7 @@ msgstr "Misslyckades att skicka Prowlmeddelande"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Dålig respons från Pushover (%s): %s"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "Misslyckades att skicka pushovermeddelande"
|
||||
|
||||
@@ -1494,7 +1495,7 @@ msgid ""
|
||||
"SABnzbd is already running."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "Allvarligt fel"
|
||||
|
||||
@@ -1516,12 +1517,6 @@ msgid ""
|
||||
"size to 4GB"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr ""
|
||||
@@ -1551,6 +1546,10 @@ msgstr "Det gick inte att döpa om \"%s\" till \"%s\""
|
||||
msgid "Failed to move files"
|
||||
msgstr "Misslyckades med att flytta filer"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "Kör skript"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "Kör användarskript %s"
|
||||
@@ -1571,7 +1570,7 @@ msgstr "Mer"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "Efterbehandling misslyckades för %s (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "se loggfil"
|
||||
|
||||
@@ -3474,7 +3473,7 @@ msgstr ""
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "Max antal omförsök"
|
||||
|
||||
@@ -3948,22 +3947,6 @@ msgstr "Enhet(er)"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "Enhet(er) där medellandet skall skickas"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4379,10 +4362,6 @@ msgstr "Om SABnzbd startar om kommer denna skärm att försvinna automatiskt!"
|
||||
msgid "WARNING:"
|
||||
msgstr "VARNING:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Hämta"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "Uppdateringsfrekvens"
|
||||
@@ -4549,12 +4528,6 @@ msgstr "Pausa i..."
|
||||
msgid "Refresh"
|
||||
msgstr "Uppdatera"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "Sortera efter ålder <small>Äldst→Nyast</small>"
|
||||
@@ -4703,6 +4676,10 @@ msgstr ""
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "Block uppdaterar vid svävande"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "Hämta"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "Ladda upp"
|
||||
@@ -4970,12 +4947,6 @@ msgstr "URL hämtning misslyckades; %s"
|
||||
#~ msgid "Folder \"%s\" does not exist"
|
||||
#~ msgstr "Mappen \"%s\" finns inte"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "SQL Commit misslyckades, se logg"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "CRC Fel i %s (%s -> %s)"
|
||||
|
||||
#~ msgid "Error: No secondary interface defined."
|
||||
#~ msgstr "Fel: Inget andrainterface definierat."
|
||||
|
||||
@@ -5031,9 +5002,6 @@ msgstr "URL hämtning misslyckades; %s"
|
||||
#~ msgid "Unpacking failed, an expected file was not unpacked"
|
||||
#~ msgstr "Uppackning misslyckades, en väntad fil är inte uppackad"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "Huvudarkiv saknas..."
|
||||
|
||||
#~ msgid "Error importing OpenSSL module. Connecting with NON-SSL"
|
||||
#~ msgstr "Misslyckades med importering av OpenSSL modul. Ansluter utan SSL"
|
||||
|
||||
|
||||
@@ -7,15 +7,15 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: sabnzbd\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2017-11-20 21:21+0000\n"
|
||||
"POT-Creation-Date: 2017-09-10 20:30+0000\n"
|
||||
"PO-Revision-Date: 2017-06-22 07:06+0000\n"
|
||||
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
|
||||
"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2017-11-21 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 18505)\n"
|
||||
"X-Launchpad-Export-Date: 2017-09-11 06:25+0000\n"
|
||||
"X-Generator: Launchpad (build 18449)\n"
|
||||
|
||||
#: SABnzbd.py [Error message]
|
||||
msgid "Failed to start web-interface"
|
||||
@@ -386,6 +386,10 @@ msgstr "“历史记录”数据库已损坏,已创建空数据库代替"
|
||||
msgid "SQL Command Failed, see log"
|
||||
msgstr "SQL 命令执行失败,参见日志"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "SQL Commit Failed, see log"
|
||||
msgstr "SQL 保存失败,参见日志"
|
||||
|
||||
#: sabnzbd/database.py [Error message]
|
||||
msgid "Failed to close database, see log"
|
||||
msgstr "无法关闭数据库,参见日志"
|
||||
@@ -402,6 +406,10 @@ msgstr "%s 解码失败"
|
||||
msgid "Decoder failure: Out of memory"
|
||||
msgstr "解码器失败:内存不足"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "CRC Error in %s (%s -> %s)"
|
||||
msgstr "CRC 错误:%s (%s -> %s)"
|
||||
|
||||
#: sabnzbd/decoder.py
|
||||
msgid "Badly formed yEnc article in %s"
|
||||
msgstr "yEnc 文章格式错误:%s"
|
||||
@@ -550,12 +558,6 @@ msgstr "无法关闭邮件连接"
|
||||
msgid "Email succeeded"
|
||||
msgstr "成功发送电子邮件"
|
||||
|
||||
#: sabnzbd/emailer.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/rating.py
|
||||
#: sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "无法发送,缺少必要的数据"
|
||||
|
||||
#: sabnzbd/emailer.py [Error message]
|
||||
msgid "Cannot find email templates in %s"
|
||||
msgstr "无法找到 email 模板:%s"
|
||||
@@ -713,11 +715,6 @@ msgstr "未定义服务器!"
|
||||
msgid "Incorrect parameter"
|
||||
msgstr "参数不正确"
|
||||
|
||||
#: sabnzbd/interface.py
|
||||
msgid ""
|
||||
"Category folder cannot be a subfolder of the Temporary Download Folder."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/interface.py # sabnzbd/interface.py
|
||||
msgid "Back"
|
||||
msgstr "返回"
|
||||
@@ -776,10 +773,6 @@ msgstr ""
|
||||
msgid "Cannot change permissions of %s"
|
||||
msgstr "无法更改 %s 的权限"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "正在执行脚本"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/postproc.py
|
||||
@@ -955,7 +948,6 @@ msgstr "正在开始修复"
|
||||
msgid "Par verify failed on %s, while QuickCheck succeeded!"
|
||||
msgstr "Par 验证失败:%s,但快速检查成功!"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Repairing failed, %s"
|
||||
@@ -982,6 +974,10 @@ msgstr "[%s] 验证耗时 %s,所有文件均完好无损"
|
||||
msgid "[%s] Verified in %s, repair is required"
|
||||
msgstr "[%s] 验证耗时 %s,需要修复"
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid "Main packet not found..."
|
||||
msgstr "主数据包未找到..."
|
||||
|
||||
#: sabnzbd/newsunpack.py # sabnzbd/newsunpack.py
|
||||
msgid ""
|
||||
"Invalid par2 files or invalid PAR2 parameters, cannot verify or repair"
|
||||
@@ -1091,6 +1087,11 @@ msgstr "其他信息"
|
||||
msgid "Not available"
|
||||
msgstr "不可用"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py # sabnzbd/rating.py # sabnzbd/rating.py
|
||||
msgid "Cannot send, missing required data"
|
||||
msgstr "无法发送,缺少必要的数据"
|
||||
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send Prowl message"
|
||||
msgstr "无法发送 Prowl 消息"
|
||||
@@ -1099,7 +1100,7 @@ msgstr "无法发送 Prowl 消息"
|
||||
msgid "Bad response from Pushover (%s): %s"
|
||||
msgstr "Pushover 响应异常 (%s): %s"
|
||||
|
||||
#: sabnzbd/notifier.py # sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
#: sabnzbd/notifier.py [Warning message] # sabnzbd/notifier.py
|
||||
msgid "Failed to send pushover message"
|
||||
msgstr "无法发送 pushover 信息"
|
||||
|
||||
@@ -1468,7 +1469,7 @@ msgid ""
|
||||
"SABnzbd is already running."
|
||||
msgstr "绑定端口 %s 在 %s 上失败。其它的程序正在使用此端口或者说 SABnzbd 正在运行。"
|
||||
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py # sabnzbd/panic.py
|
||||
#: sabnzbd/panic.py # sabnzbd/panic.py
|
||||
msgid "Fatal error"
|
||||
msgstr "致命错误"
|
||||
|
||||
@@ -1490,12 +1491,6 @@ msgid ""
|
||||
"size to 4GB"
|
||||
msgstr "已完成文件夹 %s 位于 FAT 文件系统上,这样会有最大文件为 4GB 的限制。"
|
||||
|
||||
#: sabnzbd/postproc.py [Warning message]
|
||||
msgid ""
|
||||
"Module subprocessww missing. Expect problems with Unicoded file and "
|
||||
"directory names in downloads."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Download might fail, only %s of required %s available"
|
||||
msgstr "下载可能会失败,只有 %s 块 (需要 %s) 可用"
|
||||
@@ -1524,6 +1519,10 @@ msgstr "将 \"%s\" 重命名为 \"%s\" 出错"
|
||||
msgid "Failed to move files"
|
||||
msgstr "移动文件失败"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running script"
|
||||
msgstr "正在执行脚本"
|
||||
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "Running user script %s"
|
||||
msgstr "正在执行用户脚本 %s"
|
||||
@@ -1544,7 +1543,7 @@ msgstr "更多"
|
||||
msgid "Post Processing Failed for %s (%s)"
|
||||
msgstr "后期处理失败:%s (%s)"
|
||||
|
||||
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
|
||||
#: sabnzbd/postproc.py
|
||||
msgid "see logfile"
|
||||
msgstr "查看日志文件"
|
||||
|
||||
@@ -3404,7 +3403,7 @@ msgstr "SSL 加密算法"
|
||||
msgid "Increase performance by forcing a lower SSL encryption strength."
|
||||
msgstr "降低 SSL 的加密难度以便获得更高的性能。"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Maximum retries"
|
||||
msgstr "最多重试次数"
|
||||
|
||||
@@ -3875,22 +3874,6 @@ msgstr "设备"
|
||||
msgid "Device(s) to which message should be sent"
|
||||
msgstr "信息发送的目标设备"
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency retry"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How often (in seconds) the same notification will be sent"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "Emergency expire"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Pushover settings]
|
||||
msgid "How many seconds your notification will continue to be retried"
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py [Header for Pushbullet notification section]
|
||||
msgid "Pushbullet"
|
||||
msgstr "Pushbullet"
|
||||
@@ -4305,10 +4288,6 @@ msgstr "SABnzbd 重启后本画面将自动消失!"
|
||||
msgid "WARNING:"
|
||||
msgstr "警告:"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "装取"
|
||||
|
||||
#: sabnzbd/skintext.py # sabnzbd/skintext.py
|
||||
msgid "Refresh rate"
|
||||
msgstr "刷新频率"
|
||||
@@ -4475,12 +4454,6 @@ msgstr "暂停..."
|
||||
msgid "Refresh"
|
||||
msgstr "刷新"
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid ""
|
||||
"All usernames, passwords and API-keys are automatically removed from the log "
|
||||
"and the included copy of your settings."
|
||||
msgstr ""
|
||||
|
||||
#: sabnzbd/skintext.py
|
||||
msgid "Sort by Age <small>Oldest→Newest</small>"
|
||||
msgstr "按发布时间排序 <small>最早→最新</small>"
|
||||
@@ -4627,6 +4600,10 @@ msgstr "这将在您的鼠标指针处于队列上方时阻止内容刷新。"
|
||||
msgid "Block Refreshes on Hover"
|
||||
msgstr "指向时停止刷新"
|
||||
|
||||
#: sabnzbd/skintext.py [Fetch from URL button in "Add NZB" dialog box]
|
||||
msgid "Fetch"
|
||||
msgstr "装取"
|
||||
|
||||
#: sabnzbd/skintext.py [Upload button in "Add NZB" dialog box]
|
||||
msgid "Upload"
|
||||
msgstr "上传"
|
||||
@@ -4888,12 +4865,6 @@ msgstr "URL 装取失败; %s"
|
||||
#~ msgid "Folder \"%s\" does not exist"
|
||||
#~ msgstr "文件夹 \"%s\" 不存在"
|
||||
|
||||
#~ msgid "SQL Commit Failed, see log"
|
||||
#~ msgstr "SQL 保存失败,参见日志"
|
||||
|
||||
#~ msgid "CRC Error in %s (%s -> %s)"
|
||||
#~ msgstr "CRC 错误:%s (%s -> %s)"
|
||||
|
||||
#~ msgid "Error: No secondary interface defined."
|
||||
#~ msgstr "错误: 未定义第二界面。"
|
||||
|
||||
@@ -4947,9 +4918,6 @@ msgstr "URL 装取失败; %s"
|
||||
#~ msgid "Unpacking failed, these file(s) are missing:"
|
||||
#~ msgstr "解压失败,缺这些文件:"
|
||||
|
||||
#~ msgid "Main packet not found..."
|
||||
#~ msgstr "主数据包未找到..."
|
||||
|
||||
#~ msgid "Invalid par2 files, cannot verify or repair"
|
||||
#~ msgstr "par2 文件无效,无法验证或修复"
|
||||
|
||||
|
||||
@@ -108,7 +108,7 @@ import sabnzbd.lang as lang
|
||||
import sabnzbd.par2file as par2file
|
||||
import sabnzbd.api
|
||||
import sabnzbd.directunpacker as directunpacker
|
||||
from sabnzbd.decorators import synchronized
|
||||
from sabnzbd.decorators import synchronized, notify_downloader
|
||||
from sabnzbd.constants import NORMAL_PRIORITY, VALID_ARCHIVES, \
|
||||
REPAIR_REQUEST, QUEUE_FILE_NAME, QUEUE_VERSION, QUEUE_FILE_TMPL
|
||||
import sabnzbd.getipaddress as getipaddress
|
||||
@@ -874,7 +874,7 @@ def get_new_id(prefix, folder, check_list=None):
|
||||
def save_data(data, _id, path, do_pickle=True, silent=False):
|
||||
""" Save data to a diskfile """
|
||||
if not silent:
|
||||
logging.debug('[%s] Saving data for %s in %s', misc.caller_name(), _id, path)
|
||||
logging.debug("Saving data for %s in %s", _id, path)
|
||||
path = os.path.join(path, _id)
|
||||
|
||||
# We try 3 times, to avoid any dict or access problems
|
||||
@@ -906,11 +906,11 @@ def load_data(_id, path, remove=True, do_pickle=True, silent=False):
|
||||
path = os.path.join(path, _id)
|
||||
|
||||
if not os.path.exists(path):
|
||||
logging.info("[%s] %s missing", misc.caller_name(), path)
|
||||
logging.info("%s missing", path)
|
||||
return None
|
||||
|
||||
if not silent:
|
||||
logging.debug("[%s] Loading data for %s from %s", misc.caller_name(), _id, path)
|
||||
logging.debug("Loading data for %s from %s", _id, path)
|
||||
|
||||
try:
|
||||
with open(path, 'rb') as data_file:
|
||||
@@ -923,7 +923,7 @@ def load_data(_id, path, remove=True, do_pickle=True, silent=False):
|
||||
data = data_file.read()
|
||||
|
||||
if remove:
|
||||
misc.remove_file(path)
|
||||
os.remove(path)
|
||||
except:
|
||||
logging.error(T('Loading %s failed'), path)
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
@@ -937,7 +937,8 @@ def remove_data(_id, path):
|
||||
path = os.path.join(path, _id)
|
||||
try:
|
||||
if os.path.exists(path):
|
||||
misc.remove_file(path)
|
||||
os.remove(path)
|
||||
logging.info("%s removed", path)
|
||||
except:
|
||||
logging.debug("Failed to remove %s", path)
|
||||
|
||||
@@ -945,7 +946,7 @@ def remove_data(_id, path):
|
||||
def save_admin(data, _id):
|
||||
""" Save data in admin folder in specified format """
|
||||
path = os.path.join(cfg.admin_dir.get_path(), _id)
|
||||
logging.debug("[%s] Saving data for %s in %s", misc.caller_name(), _id, path)
|
||||
logging.info("Saving data for %s in %s", _id, path)
|
||||
|
||||
# We try 3 times, to avoid any dict or access problems
|
||||
for t in xrange(3):
|
||||
@@ -968,10 +969,10 @@ def save_admin(data, _id):
|
||||
def load_admin(_id, remove=False, silent=False):
|
||||
""" Read data in admin folder in specified format """
|
||||
path = os.path.join(cfg.admin_dir.get_path(), _id)
|
||||
logging.debug("[%s] Loading data for %s from %s", misc.caller_name(), _id, path)
|
||||
logging.info("Loading data for %s from %s", _id, path)
|
||||
|
||||
if not os.path.exists(path):
|
||||
logging.info("[%s] %s missing", misc.caller_name(), path)
|
||||
logging.info("%s missing", path)
|
||||
return None
|
||||
|
||||
try:
|
||||
@@ -981,7 +982,7 @@ def load_admin(_id, remove=False, silent=False):
|
||||
else:
|
||||
data = cPickle.load(data_file)
|
||||
if remove:
|
||||
misc.remove_file(path)
|
||||
os.remove(path)
|
||||
except:
|
||||
if not silent:
|
||||
excepterror = str(sys.exc_info()[0])
|
||||
@@ -1035,7 +1036,7 @@ def check_repair_request():
|
||||
path = os.path.join(cfg.admin_dir.get_path(), REPAIR_REQUEST)
|
||||
if os.path.exists(path):
|
||||
try:
|
||||
misc.remove_file(path)
|
||||
os.remove(path)
|
||||
except:
|
||||
pass
|
||||
return True
|
||||
@@ -1106,7 +1107,7 @@ def pid_file(pid_path=None, pid_file=None, port=0):
|
||||
f.write('%d\n' % os.getpid())
|
||||
f.close()
|
||||
else:
|
||||
misc.remove_file(DIR_PID)
|
||||
os.remove(DIR_PID)
|
||||
except:
|
||||
logging.warning('Cannot access PID file %s', DIR_PID)
|
||||
|
||||
|
||||
@@ -1358,7 +1358,7 @@ def build_queue(start=0, limit=0, trans=False, output=None, search=None):
|
||||
slot['status'] = "%s" % (status)
|
||||
|
||||
if (Downloader.do.paused or Downloader.do.postproc or is_propagating or \
|
||||
status not in (Status.DOWNLOADING, Status.FETCHING, Status.QUEUED)) and priority != TOP_PRIORITY:
|
||||
status not in (Status.DOWNLOADING, Status.QUEUED)) and priority != TOP_PRIORITY:
|
||||
slot['timeleft'] = '0:00:00'
|
||||
slot['eta'] = 'unknown'
|
||||
else:
|
||||
@@ -1687,7 +1687,7 @@ def build_queue_header(search=None, start=0, limit=0, output=None):
|
||||
bytes = qnfo.bytes
|
||||
|
||||
header['kbpersec'] = "%.2f" % (bytespersec / KIBI)
|
||||
header['speed'] = to_units(bytespersec, spaces=1)
|
||||
header['speed'] = to_units(bytespersec, spaces=1, dec_limit=1)
|
||||
header['mbleft'] = "%.2f" % (bytesleft / MEBI)
|
||||
header['mb'] = "%.2f" % (bytes / MEBI)
|
||||
header['sizeleft'] = format_bytes(bytesleft)
|
||||
|
||||
@@ -22,7 +22,6 @@ sabnzbd.articlecache - Article cache handling
|
||||
import sys
|
||||
import logging
|
||||
import threading
|
||||
import struct
|
||||
|
||||
import sabnzbd
|
||||
from sabnzbd.decorators import synchronized
|
||||
@@ -41,13 +40,6 @@ class ArticleCache(object):
|
||||
self.__cache_size = 0
|
||||
self.__article_list = [] # List of buffered articles
|
||||
self.__article_table = {} # Dict of buffered articles
|
||||
|
||||
# On 32 bit we only allow the user to set 1GB
|
||||
# For 64 bit we allow up to 4GB, in case somebody wants that
|
||||
self.__cache_upper_limit = GIGI
|
||||
if sabnzbd.DARWIN or sabnzbd.WIN64 or (struct.calcsize("P") * 8) == 64:
|
||||
self.__cache_upper_limit = 4*GIGI
|
||||
|
||||
ArticleCache.do = self
|
||||
|
||||
@synchronized(ARTICLE_LOCK)
|
||||
@@ -59,9 +51,9 @@ class ArticleCache(object):
|
||||
""" Called when cache limit changes """
|
||||
self.__cache_limit_org = limit
|
||||
if limit < 0:
|
||||
self.__cache_limit = self.__cache_upper_limit
|
||||
self.__cache_limit = GIGI
|
||||
else:
|
||||
self.__cache_limit = min(limit, self.__cache_upper_limit)
|
||||
self.__cache_limit = min(limit, GIGI)
|
||||
|
||||
@synchronized(ARTICLE_LOCK)
|
||||
def reserve_space(self, data):
|
||||
@@ -82,24 +74,23 @@ class ArticleCache(object):
|
||||
|
||||
@synchronized(ARTICLE_LOCK)
|
||||
def save_article(self, article, data):
|
||||
if article.nzf.nzo.is_gone():
|
||||
nzf = article.nzf
|
||||
nzo = nzf.nzo
|
||||
|
||||
if nzo.is_gone():
|
||||
# Do not discard this article because the
|
||||
# file might still be processed at this moment!!
|
||||
return
|
||||
|
||||
# Register article
|
||||
if article not in article.nzf.nzo.saved_articles:
|
||||
article.nzf.nzo.saved_articles.append(article)
|
||||
saved_articles = article.nzf.nzo.saved_articles
|
||||
|
||||
if article.lowest_partnum and not article.nzf.import_finished:
|
||||
# Write the first-fetched articles to disk
|
||||
# Otherwise the cache could overflow
|
||||
self.__flush_article(article, data)
|
||||
return
|
||||
if article not in saved_articles:
|
||||
saved_articles.append(article)
|
||||
|
||||
if self.__cache_limit:
|
||||
if self.__cache_limit < 0:
|
||||
self.__add_to_cache(article, data)
|
||||
|
||||
else:
|
||||
data_size = len(data)
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ from sabnzbd.postproc import PostProcessor
|
||||
import sabnzbd.downloader
|
||||
import sabnzbd.par2file as par2file
|
||||
import sabnzbd.utils.rarfile as rarfile
|
||||
from sabnzbd.encoding import unicoder
|
||||
from sabnzbd.encoding import unicoder, is_utf8
|
||||
from sabnzbd.rating import Rating
|
||||
|
||||
|
||||
@@ -76,7 +76,7 @@ class Assembler(Thread):
|
||||
if not sabnzbd.downloader.Downloader.do.paused:
|
||||
logging.warning(T('Too little diskspace forcing PAUSE'))
|
||||
# Pause downloader, but don't save, since the disk is almost full!
|
||||
sabnzbd.downloader.Downloader.do.pause()
|
||||
sabnzbd.downloader.Downloader.do.pause(save=False)
|
||||
sabnzbd.emailer.diskfull()
|
||||
# Abort all direct unpackers, just to be sure
|
||||
sabnzbd.directunpacker.abort_all()
|
||||
@@ -97,17 +97,15 @@ class Assembler(Thread):
|
||||
try:
|
||||
filepath = self.assemble(nzf, filepath)
|
||||
except IOError, (errno, strerror):
|
||||
# If job was deleted or in active post-processing, ignore error
|
||||
if not nzo.deleted and not nzo.is_gone() and not nzo.pp_active:
|
||||
# If job was deleted, ignore error
|
||||
if not nzo.is_gone():
|
||||
# 28 == disk full => pause downloader
|
||||
if errno == 28:
|
||||
logging.error(T('Disk full! Forcing Pause'))
|
||||
else:
|
||||
logging.error(T('Disk error on creating file %s'), clip_path(filepath))
|
||||
# Log traceback
|
||||
logging.info('Traceback: ', exc_info=True)
|
||||
# Pause without saving
|
||||
sabnzbd.downloader.Downloader.do.pause()
|
||||
sabnzbd.downloader.Downloader.do.pause(save=False)
|
||||
continue
|
||||
except:
|
||||
logging.error(T('Fatal error in Assembler'), exc_info=True)
|
||||
@@ -320,8 +318,7 @@ def check_encrypted_and_unwanted_files(nzo, filepath):
|
||||
zf.close()
|
||||
del zf
|
||||
except:
|
||||
logging.info('Error during inspection of RAR-file %s', filepath)
|
||||
logging.debug('Traceback: ', exc_info=True)
|
||||
logging.info('Error during inspection of RAR-file %s', filepath, exc_info=True)
|
||||
|
||||
return encrypted, unwanted
|
||||
|
||||
|
||||
@@ -261,7 +261,6 @@ fixed_ports = OptionBool('misc', 'fixed_ports', False)
|
||||
api_warnings = OptionBool('misc', 'api_warnings', True, protect=True)
|
||||
disable_key = OptionBool('misc', 'disable_api_key', False, protect=True)
|
||||
no_penalties = OptionBool('misc', 'no_penalties', False)
|
||||
debug_log_decoding = OptionBool('misc', 'debug_log_decoding', False)
|
||||
|
||||
# Text values
|
||||
rss_odd_titles = OptionList('misc', 'rss_odd_titles', ['nzbindex.nl/', 'nzbindex.com/', 'nzbclub.com/'])
|
||||
@@ -375,8 +374,6 @@ prowl_prio_other = OptionNumber('prowl', 'prowl_prio_other', -3)
|
||||
pushover_token = OptionStr('pushover', 'pushover_token')
|
||||
pushover_userkey = OptionStr('pushover', 'pushover_userkey')
|
||||
pushover_device = OptionStr('pushover', 'pushover_device')
|
||||
pushover_emergency_expire = OptionNumber('pushover', 'pushover_emergency_expire', 3600)
|
||||
pushover_emergency_retry = OptionNumber('pushover', 'pushover_emergency_retry', 60)
|
||||
pushover_enable = OptionBool('pushover', 'pushover_enable')
|
||||
pushover_cats = OptionList('pushover', 'pushover_cats', ['*'])
|
||||
pushover_prio_startup = OptionNumber('pushover', 'pushover_prio_startup', -3)
|
||||
|
||||
@@ -385,7 +385,7 @@ class ConfigServer(object):
|
||||
self.displayname = OptionStr(name, 'displayname', '', add=False)
|
||||
self.host = OptionStr(name, 'host', '', add=False)
|
||||
self.port = OptionNumber(name, 'port', 119, 0, 2 ** 16 - 1, add=False)
|
||||
self.timeout = OptionNumber(name, 'timeout', 60, 20, 240, add=False)
|
||||
self.timeout = OptionNumber(name, 'timeout', 120, 30, 240, add=False)
|
||||
self.username = OptionStr(name, 'username', '', add=False)
|
||||
self.password = OptionPassword(name, 'password', '', add=False)
|
||||
self.connections = OptionNumber(name, 'connections', 1, 0, 100, add=False)
|
||||
@@ -395,7 +395,7 @@ class ConfigServer(object):
|
||||
self.optional = OptionBool(name, 'optional', False, add=False)
|
||||
self.retention = OptionNumber(name, 'retention', add=False)
|
||||
self.send_group = OptionBool(name, 'send_group', False, add=False)
|
||||
self.priority = OptionNumber(name, 'priority', 0, 0, 99, add=False)
|
||||
self.priority = OptionNumber(name, 'priority', 0, 0, 100, add=False)
|
||||
# 'fillserver' field only here in order to set a proper priority when converting
|
||||
self.fillserver = OptionBool(name, 'fillserver', False, add=False)
|
||||
self.notes = OptionStr(name, 'notes', '', add=False)
|
||||
@@ -859,7 +859,7 @@ def save_config(force=False):
|
||||
logging.error(T('Cannot write to INI file %s'), filename)
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
try:
|
||||
sabnzbd.misc.remove_file(filename)
|
||||
os.remove(filename)
|
||||
except:
|
||||
pass
|
||||
# Restore INI file from backup
|
||||
|
||||
@@ -51,7 +51,7 @@ RENAMES_FILE = '__renames__'
|
||||
ATTRIB_FILE = 'SABnzbd_attrib'
|
||||
REPAIR_REQUEST = 'repair-all.sab'
|
||||
|
||||
SABYENC_VERSION_REQUIRED = '3.3.2'
|
||||
SABYENC_VERSION_REQUIRED = '3.3.1'
|
||||
|
||||
DB_HISTORY_VERSION = 1
|
||||
DB_HISTORY_NAME = 'history%s.db' % DB_HISTORY_VERSION
|
||||
@@ -77,7 +77,6 @@ DEF_LOG_CHERRY = 'cherrypy.log'
|
||||
DEF_CACHE_LIMIT = '450M'
|
||||
DEF_TIMEOUT = 60
|
||||
DEF_SCANRATE = 5
|
||||
MAX_URL_RETRIES = 10
|
||||
MAX_DECODE_QUEUE = 10
|
||||
LIMIT_DECODE_QUEUE = 100
|
||||
MAX_WARNINGS = 20
|
||||
|
||||
@@ -40,7 +40,7 @@ from sabnzbd.constants import DB_HISTORY_NAME, STAGES
|
||||
from sabnzbd.encoding import unicoder
|
||||
from sabnzbd.bpsmeter import this_week, this_month
|
||||
from sabnzbd.decorators import synchronized
|
||||
from sabnzbd.misc import get_all_passwords, int_conv, remove_file, caller_name
|
||||
from sabnzbd.misc import get_all_passwords, int_conv
|
||||
|
||||
DB_LOCK = threading.RLock()
|
||||
|
||||
@@ -143,7 +143,7 @@ class HistoryDB(object):
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
self.close()
|
||||
try:
|
||||
remove_file(HistoryDB.db_path)
|
||||
os.remove(HistoryDB.db_path)
|
||||
except:
|
||||
pass
|
||||
self.connect()
|
||||
@@ -236,7 +236,7 @@ class HistoryDB(object):
|
||||
|
||||
for job in jobs:
|
||||
self.execute("""DELETE FROM history WHERE nzo_id=?""", (job,), save=True)
|
||||
logging.info('[%s] Removing job %s from history', caller_name(), job)
|
||||
logging.info('Removing job %s from history', job)
|
||||
|
||||
def auto_history_purge(self):
|
||||
""" Remove history items based on the configured history-retention """
|
||||
|
||||
@@ -31,7 +31,6 @@ from sabnzbd.constants import Status, MAX_DECODE_QUEUE, LIMIT_DECODE_QUEUE, SABY
|
||||
import sabnzbd.articlecache
|
||||
import sabnzbd.downloader
|
||||
import sabnzbd.nzbqueue
|
||||
import sabnzbd.cfg as cfg
|
||||
from sabnzbd.encoding import yenc_name_fixer
|
||||
from sabnzbd.misc import match_str
|
||||
|
||||
@@ -48,8 +47,8 @@ try:
|
||||
import sabyenc
|
||||
SABYENC_ENABLED = True
|
||||
SABYENC_VERSION = sabyenc.__version__
|
||||
# Verify version to at least match minor version
|
||||
if SABYENC_VERSION[:3] != SABYENC_VERSION_REQUIRED[:3]:
|
||||
# Verify version
|
||||
if SABYENC_VERSION != SABYENC_VERSION_REQUIRED:
|
||||
raise ImportError
|
||||
except ImportError:
|
||||
SABYENC_ENABLED = False
|
||||
@@ -80,7 +79,6 @@ class Decoder(Thread):
|
||||
|
||||
self.queue = queue
|
||||
self.servers = servers
|
||||
self.__log_decoding = cfg.debug_log_decoding()
|
||||
|
||||
def stop(self):
|
||||
# Put multiple to stop all decoders
|
||||
@@ -117,9 +115,7 @@ class Decoder(Thread):
|
||||
if nzo.precheck:
|
||||
raise BadYenc
|
||||
register = True
|
||||
|
||||
if self.__log_decoding:
|
||||
logging.debug("Decoding %s", art_id)
|
||||
logging.debug("Decoding %s", art_id)
|
||||
|
||||
data = self.decode(article, lines, raw_data)
|
||||
nzf.article_count += 1
|
||||
@@ -131,7 +127,8 @@ class Decoder(Thread):
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
|
||||
sabnzbd.downloader.Downloader.do.pause()
|
||||
sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(article)
|
||||
article.fetcher = None
|
||||
sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(nzf, nzo)
|
||||
register = False
|
||||
|
||||
except MemoryError, e:
|
||||
@@ -142,11 +139,12 @@ class Decoder(Thread):
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
|
||||
sabnzbd.downloader.Downloader.do.pause()
|
||||
sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(article)
|
||||
article.fetcher = None
|
||||
sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(nzf, nzo)
|
||||
register = False
|
||||
|
||||
except CrcError, e:
|
||||
logme = 'CRC Error in %s' % art_id
|
||||
logme = T('CRC Error in %s') % art_id
|
||||
logging.info(logme)
|
||||
|
||||
data = e.data
|
||||
@@ -314,10 +312,10 @@ class Decoder(Thread):
|
||||
for server in self.servers:
|
||||
if server.active and not article.server_in_try_list(server):
|
||||
if server.priority >= article.fetcher.priority:
|
||||
|
||||
article.fetcher = None
|
||||
article.tries = 0
|
||||
# Allow all servers for this nzo and nzf again (but not for this article)
|
||||
sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(article, article_reset=False)
|
||||
sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(article.nzf, article.nzf.nzo)
|
||||
return True
|
||||
|
||||
msg = T('%s => missing from all servers, discarding') % article
|
||||
@@ -335,7 +333,7 @@ class Decoder(Thread):
|
||||
return
|
||||
|
||||
# Set the md5-of-16k if this is the first article
|
||||
if article.lowest_partnum:
|
||||
if article.partnum == nzf.lowest_partnum:
|
||||
nzf.md5of16k = hashlib.md5(decoded_data[:16384]).digest()
|
||||
|
||||
# Try the rename
|
||||
|
||||
@@ -20,27 +20,21 @@
|
||||
##############################################################################
|
||||
from threading import RLock, Condition
|
||||
|
||||
|
||||
# All operations that modify the queue need to happen in a lock
|
||||
# Also used when importing NZBs to prevent IO-race conditions
|
||||
# Names of wrapper-functions should be the same in misc.caller_name
|
||||
# The NzbQueueLocker both locks and notifies the Downloader
|
||||
NZBQUEUE_LOCK = RLock()
|
||||
DOWNLOADER_CV = Condition(NZBQUEUE_LOCK)
|
||||
DOWNLOADER_CV = Condition(RLock())
|
||||
|
||||
def synchronized(lock):
|
||||
def wrap(f):
|
||||
def call_func(*args, **kw):
|
||||
def newFunction(*args, **kw):
|
||||
lock.acquire()
|
||||
try:
|
||||
return f(*args, **kw)
|
||||
finally:
|
||||
lock.release()
|
||||
return call_func
|
||||
return newFunction
|
||||
return wrap
|
||||
|
||||
|
||||
def NzbQueueLocker(func):
|
||||
def notify_downloader(func):
|
||||
global DOWNLOADER_CV
|
||||
def call_func(*params, **kparams):
|
||||
DOWNLOADER_CV.acquire()
|
||||
|
||||
@@ -28,23 +28,19 @@ import logging
|
||||
|
||||
import sabnzbd
|
||||
import sabnzbd.cfg as cfg
|
||||
from sabnzbd.misc import int_conv, clip_path, long_path, remove_all, globber, \
|
||||
format_time_string, has_win_device, real_path, remove_file
|
||||
from sabnzbd.misc import int_conv, clip_path, remove_all, globber, format_time_string, has_win_device
|
||||
from sabnzbd.encoding import TRANS, unicoder
|
||||
from sabnzbd.newsunpack import build_command, EXTRACTFROM_RE, EXTRACTED_RE, rar_volumelist
|
||||
from sabnzbd.newsunpack import build_command, EXTRACTFROM_RE, rar_volumelist
|
||||
from sabnzbd.postproc import prepare_extraction_path
|
||||
from sabnzbd.utils.rarfile import RarFile
|
||||
from sabnzbd.utils.diskspeed import diskspeedmeasure
|
||||
|
||||
if sabnzbd.WIN32:
|
||||
try:
|
||||
# Use patched version of subprocess module for Unicode on Windows
|
||||
import subprocessww
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
# Load the regular POpen (which is now patched on Windows)
|
||||
from subprocess import Popen
|
||||
# Load the POpen from the fixed unicode-subprocess
|
||||
from sabnzbd.utils.subprocess_fix import Popen
|
||||
else:
|
||||
# Load the regular POpen
|
||||
from subprocess import Popen
|
||||
|
||||
MAX_ACTIVE_UNPACKERS = 10
|
||||
ACTIVE_UNPACKERS = []
|
||||
@@ -154,7 +150,6 @@ class DirectUnpacker(threading.Thread):
|
||||
last_volume_linebuf = ''
|
||||
unrar_log = []
|
||||
rarfiles = []
|
||||
extracted = []
|
||||
start_time = time.time()
|
||||
|
||||
# Need to read char-by-char because there's no newline after new-disk message
|
||||
@@ -177,21 +172,10 @@ class DirectUnpacker(threading.Thread):
|
||||
logging.info('Error in DirectUnpack of %s', self.cur_setname)
|
||||
self.abort()
|
||||
|
||||
if linebuf.endswith('\n'):
|
||||
# List files we used
|
||||
if linebuf.startswith('Extracting from'):
|
||||
filename = TRANS((re.search(EXTRACTFROM_RE, linebuf.strip()).group(1)))
|
||||
if filename not in rarfiles:
|
||||
rarfiles.append(filename)
|
||||
|
||||
# List files we extracted
|
||||
m = re.search(EXTRACTED_RE, linebuf)
|
||||
if m:
|
||||
# In case of flat-unpack, UnRar still prints the whole path (?!)
|
||||
unpacked_file = TRANS(m.group(2))
|
||||
if cfg.flat_unpack():
|
||||
unpacked_file = os.path.basename(unpacked_file)
|
||||
extracted.append(real_path(self.unpack_dir_info[0], unpacked_file))
|
||||
if linebuf.startswith('Extracting from') and linebuf.endswith('\n'):
|
||||
filename = TRANS((re.search(EXTRACTFROM_RE, linebuf.strip()).group(1)))
|
||||
if filename not in rarfiles:
|
||||
rarfiles.append(filename)
|
||||
|
||||
# Did we reach the end?
|
||||
if linebuf.endswith('All OK'):
|
||||
@@ -201,23 +185,16 @@ class DirectUnpacker(threading.Thread):
|
||||
|
||||
# Add to success
|
||||
rarfile_path = os.path.join(self.nzo.downpath, self.rarfile_nzf.filename)
|
||||
self.success_sets[self.cur_setname] = (rar_volumelist(rarfile_path, self.nzo.password, rarfiles), extracted)
|
||||
self.success_sets[self.cur_setname] = rar_volumelist(rarfile_path, self.nzo.password, rarfiles)
|
||||
logging.info('DirectUnpack completed for %s', self.cur_setname)
|
||||
self.nzo.set_action_line(T('Direct Unpack'), T('Completed'))
|
||||
|
||||
# List success in history-info
|
||||
msg = T('Unpacked %s files/folders in %s') % (len(extracted), format_time_string(self.unpack_time))
|
||||
msg = '%s - %s' % (T('Direct Unpack'), msg)
|
||||
self.nzo.set_unpack_info('Unpack', '[%s] %s' % (unicoder(self.cur_setname), msg))
|
||||
|
||||
# Write current log and clear
|
||||
unrar_log.append(linebuf.strip())
|
||||
linebuf = ''
|
||||
last_volume_linebuf = ''
|
||||
logging.debug('DirectUnpack Unrar output %s', '\n'.join(unrar_log))
|
||||
unrar_log = []
|
||||
rarfiles = []
|
||||
extracted = []
|
||||
|
||||
# Are there more files left?
|
||||
while self.nzo.files and not self.next_sets:
|
||||
@@ -247,15 +224,10 @@ class DirectUnpacker(threading.Thread):
|
||||
|
||||
# Possible that the instance was deleted while locked
|
||||
if not self.killed:
|
||||
# If unrar stopped or is killed somehow, writing will cause a crash
|
||||
try:
|
||||
# Give unrar some time to do it's thing
|
||||
self.active_instance.stdin.write('C\n')
|
||||
start_time = time.time()
|
||||
time.sleep(0.1)
|
||||
except IOError:
|
||||
self.abort()
|
||||
break
|
||||
# Give unrar some time to do it's thing
|
||||
self.active_instance.stdin.write('\n')
|
||||
start_time = time.time()
|
||||
time.sleep(0.1)
|
||||
|
||||
# Did we unpack a new volume? Sometimes UnRar hangs on 1 volume
|
||||
if not last_volume_linebuf or last_volume_linebuf != linebuf:
|
||||
@@ -265,12 +237,9 @@ class DirectUnpacker(threading.Thread):
|
||||
logging.info('DirectUnpacked volume %s for %s', self.cur_volume, self.cur_setname)
|
||||
|
||||
# If lines did not change and we don't have the next volume, this download is missing files!
|
||||
if last_volume_linebuf == linebuf:
|
||||
if not self.have_next_volume():
|
||||
logging.info('DirectUnpack failed due to missing files %s', self.cur_setname)
|
||||
self.abort()
|
||||
else:
|
||||
logging.debug('Duplicate output line detected: "%s"', last_volume_linebuf)
|
||||
if last_volume_linebuf == linebuf and not self.have_next_volume():
|
||||
logging.info('DirectUnpack failed due to missing files %s', self.cur_setname)
|
||||
self.abort()
|
||||
|
||||
last_volume_linebuf = linebuf
|
||||
|
||||
@@ -283,6 +252,14 @@ class DirectUnpacker(threading.Thread):
|
||||
unrar_log.append(linebuf.strip())
|
||||
logging.debug('DirectUnpack Unrar output %s', '\n'.join(unrar_log))
|
||||
|
||||
# Save information if success
|
||||
if self.success_sets:
|
||||
# The number is wrong if one_folder, just leave empty
|
||||
nr_files = '' if self.unpack_dir_info[3] else len(globber(self.unpack_dir_info[0]))
|
||||
msg = T('Unpacked %s files/folders in %s') % (nr_files, format_time_string(self.unpack_time))
|
||||
msg = '%s - %s' % (T('Direct Unpack'), msg)
|
||||
self.nzo.set_unpack_info('Unpack', '[%s] %s' % (unicoder(self.cur_setname), msg))
|
||||
|
||||
# Make more space
|
||||
self.reset_active()
|
||||
if self in ACTIVE_UNPACKERS:
|
||||
@@ -313,14 +290,7 @@ class DirectUnpacker(threading.Thread):
|
||||
""" Start the unrar instance using the user's options """
|
||||
# Generate extraction path and save for post-proc
|
||||
if not self.unpack_dir_info:
|
||||
try:
|
||||
self.unpack_dir_info = prepare_extraction_path(self.nzo)
|
||||
except:
|
||||
# Prevent fatal crash if directory creation fails
|
||||
self.abort()
|
||||
return
|
||||
|
||||
# Get the information
|
||||
self.unpack_dir_info = prepare_extraction_path(self.nzo)
|
||||
extraction_path, _, _, one_folder, _ = self.unpack_dir_info
|
||||
|
||||
# Set options
|
||||
@@ -340,11 +310,13 @@ class DirectUnpacker(threading.Thread):
|
||||
# Generate command
|
||||
rarfile_path = os.path.join(self.nzo.downpath, self.rarfile_nzf.filename)
|
||||
if sabnzbd.WIN32:
|
||||
# For Unrar to support long-path, we need to cricumvent Python's list2cmdline
|
||||
# See: https://github.com/sabnzbd/sabnzbd/issues/1043
|
||||
command = ['%s' % sabnzbd.newsunpack.RAR_COMMAND, action, '-vp', '-idp', '-o+', '-ai', password_command,
|
||||
'%s' % clip_path(rarfile_path), '%s\\' % long_path(extraction_path)]
|
||||
|
||||
if not has_win_device(rarfile_path):
|
||||
command = ['%s' % sabnzbd.newsunpack.RAR_COMMAND, action, '-vp', '-idp', '-o+', '-ai', password_command,
|
||||
'%s' % clip_path(rarfile_path), clip_path(extraction_path)]
|
||||
else:
|
||||
# Need long-path notation in case of forbidden-names
|
||||
command = ['%s' % sabnzbd.newsunpack.RAR_COMMAND, action, '-vp', '-idp', '-o+', '-ai', password_command,
|
||||
'%s' % clip_path(rarfile_path), '%s\\' % extraction_path]
|
||||
else:
|
||||
# Don't use "-ai" (not needed for non-Windows)
|
||||
command = ['%s' % sabnzbd.newsunpack.RAR_COMMAND, action, '-vp', '-idp', '-o+', password_command,
|
||||
@@ -355,9 +327,9 @@ class DirectUnpacker(threading.Thread):
|
||||
|
||||
# Let's start from the first one!
|
||||
self.cur_volume = 1
|
||||
stup, need_shell, command, creationflags = build_command(command, flatten_command=True)
|
||||
stup, need_shell, command, creationflags = build_command(command)
|
||||
logging.debug('Running unrar for DirectUnpack %s', command)
|
||||
self.active_instance = Popen(command, shell=False, stdin=subprocess.PIPE,
|
||||
self.active_instance = Popen(command, shell=need_shell, stdin=subprocess.PIPE,
|
||||
stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
|
||||
startupinfo=stup, creationflags=creationflags)
|
||||
# Add to runners
|
||||
@@ -400,7 +372,8 @@ class DirectUnpacker(threading.Thread):
|
||||
for rm_file in rar_contents:
|
||||
# Flat-unpack, so remove foldername from RarFile output
|
||||
f = os.path.join(extraction_path, os.path.basename(rm_file))
|
||||
remove_file(f)
|
||||
logging.debug('Removing file %s', f)
|
||||
os.remove(f)
|
||||
except:
|
||||
# The user will have to remove it themselves
|
||||
logging.info('Failed to clean Direct Unpack after aborting %s', rarfile_nzf.filename, exc_info=True)
|
||||
|
||||
@@ -31,7 +31,6 @@ import sabnzbd
|
||||
from sabnzbd.constants import SCAN_FILE_NAME, VALID_ARCHIVES
|
||||
import sabnzbd.utils.rarfile as rarfile
|
||||
from sabnzbd.encoding import platform_encode
|
||||
from sabnzbd.decorators import NzbQueueLocker
|
||||
from sabnzbd.newsunpack import is_sevenfile, SevenZip
|
||||
import sabnzbd.nzbstuff as nzbstuff
|
||||
import sabnzbd.misc as misc
|
||||
@@ -97,7 +96,6 @@ def is_archive(path):
|
||||
return 1, None, ''
|
||||
|
||||
|
||||
@NzbQueueLocker
|
||||
def ProcessArchiveFile(filename, path, pp=None, script=None, cat=None, catdir=None, keep=False,
|
||||
priority=None, url='', nzbname=None, password=None, nzo_id=None):
|
||||
""" Analyse ZIP file and create job(s).
|
||||
@@ -162,7 +160,7 @@ def ProcessArchiveFile(filename, path, pp=None, script=None, cat=None, catdir=No
|
||||
zf.close()
|
||||
try:
|
||||
if not keep:
|
||||
misc.remove_file(path)
|
||||
os.remove(path)
|
||||
except:
|
||||
logging.error(T('Error removing %s'), misc.clip_path(path))
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
@@ -174,7 +172,6 @@ def ProcessArchiveFile(filename, path, pp=None, script=None, cat=None, catdir=No
|
||||
return status, nzo_ids
|
||||
|
||||
|
||||
@NzbQueueLocker
|
||||
def ProcessSingleFile(filename, path, pp=None, script=None, cat=None, catdir=None, keep=False,
|
||||
priority=None, nzbname=None, reuse=False, nzo_info=None, dup_check=True, url='',
|
||||
password=None, nzo_id=None):
|
||||
@@ -249,7 +246,7 @@ def ProcessSingleFile(filename, path, pp=None, script=None, cat=None, catdir=Non
|
||||
nzo.update_rating()
|
||||
try:
|
||||
if not keep:
|
||||
misc.remove_file(path)
|
||||
os.remove(path)
|
||||
except:
|
||||
logging.error(T('Error removing %s'), misc.clip_path(path))
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
|
||||
@@ -30,7 +30,7 @@ import sys
|
||||
import Queue
|
||||
|
||||
import sabnzbd
|
||||
from sabnzbd.decorators import synchronized, NzbQueueLocker, DOWNLOADER_CV
|
||||
from sabnzbd.decorators import synchronized, notify_downloader, DOWNLOADER_CV
|
||||
from sabnzbd.constants import MAX_DECODE_QUEUE, LIMIT_DECODE_QUEUE
|
||||
from sabnzbd.decoder import Decoder
|
||||
from sabnzbd.newswrapper import NewsWrapper, request_server_info
|
||||
@@ -256,12 +256,12 @@ class Downloader(Thread):
|
||||
|
||||
return
|
||||
|
||||
@NzbQueueLocker
|
||||
@notify_downloader
|
||||
def set_paused_state(self, state):
|
||||
""" Set downloader to specified paused state """
|
||||
self.paused = state
|
||||
|
||||
@NzbQueueLocker
|
||||
@notify_downloader
|
||||
def resume(self):
|
||||
# Do not notify when SABnzbd is still starting
|
||||
if self.paused and sabnzbd.WEB_DIR:
|
||||
@@ -269,8 +269,8 @@ class Downloader(Thread):
|
||||
notifier.send_notification("SABnzbd", T('Resuming'), 'download')
|
||||
self.paused = False
|
||||
|
||||
@NzbQueueLocker
|
||||
def pause(self):
|
||||
@notify_downloader
|
||||
def pause(self, save=True):
|
||||
""" Pause the downloader, optionally saving admin """
|
||||
if not self.paused:
|
||||
self.paused = True
|
||||
@@ -280,12 +280,14 @@ class Downloader(Thread):
|
||||
BPSMeter.do.reset()
|
||||
if cfg.autodisconnect():
|
||||
self.disconnect()
|
||||
if save:
|
||||
ArticleCache.do.flush_articles()
|
||||
|
||||
def delay(self):
|
||||
logging.debug("Delaying")
|
||||
self.delayed = True
|
||||
|
||||
@NzbQueueLocker
|
||||
@notify_downloader
|
||||
def undelay(self):
|
||||
logging.debug("Undelaying")
|
||||
self.delayed = False
|
||||
@@ -294,7 +296,7 @@ class Downloader(Thread):
|
||||
logging.info("Waiting for post-processing to finish")
|
||||
self.postproc = True
|
||||
|
||||
@NzbQueueLocker
|
||||
@notify_downloader
|
||||
def resume_from_postproc(self):
|
||||
logging.info("Post-processing finished, resuming download")
|
||||
self.postproc = False
|
||||
@@ -538,7 +540,7 @@ class Downloader(Thread):
|
||||
# Check 10 seconds after enabling slowdown
|
||||
if self.can_be_slowed_timer and time.time() > self.can_be_slowed_timer + 10:
|
||||
# Now let's check if it was stable in the last 10 seconds
|
||||
self.can_be_slowed = BPSMeter.do.get_stable_speed(timespan=10)
|
||||
self.can_be_slowed = (BPSMeter.do.get_stable_speed(timespan=10) > 0)
|
||||
self.can_be_slowed_timer = 0
|
||||
logging.debug('Downloader-slowdown: %r', self.can_be_slowed)
|
||||
|
||||
@@ -792,8 +794,11 @@ class Downloader(Thread):
|
||||
# Too many tries on this server, consider article missing
|
||||
self.decode(article, None, None)
|
||||
else:
|
||||
# Remove this server from try_list
|
||||
article.fetcher = None
|
||||
|
||||
# Allow all servers to iterate over each nzo/nzf again
|
||||
sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(article)
|
||||
sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(article.nzf, article.nzf.nzo)
|
||||
|
||||
if destroy:
|
||||
nw.terminate(quit=quit)
|
||||
@@ -858,7 +863,7 @@ class Downloader(Thread):
|
||||
del self._timers[server_id]
|
||||
self.init_server(server_id, server_id)
|
||||
|
||||
@NzbQueueLocker
|
||||
@notify_downloader
|
||||
@synchronized(TIMER_LOCK)
|
||||
def unblock(self, server_id):
|
||||
# Remove timer
|
||||
@@ -877,7 +882,7 @@ class Downloader(Thread):
|
||||
for server_id in self._timers.keys():
|
||||
self.unblock(server_id)
|
||||
|
||||
@NzbQueueLocker
|
||||
@notify_downloader
|
||||
@synchronized(TIMER_LOCK)
|
||||
def check_timers(self):
|
||||
""" Make sure every server without a non-expired timer is active """
|
||||
@@ -900,7 +905,7 @@ class Downloader(Thread):
|
||||
def update_server(self, oldserver, newserver):
|
||||
self.init_server(oldserver, newserver)
|
||||
|
||||
@NzbQueueLocker
|
||||
@notify_downloader
|
||||
def wakeup(self):
|
||||
""" Just rattle the semaphore """
|
||||
pass
|
||||
|
||||
@@ -149,8 +149,6 @@ def send(message, email_to, test=None):
|
||||
else:
|
||||
logging.info("Notification e-mail successfully sent")
|
||||
return T('Email succeeded')
|
||||
else:
|
||||
return T('Cannot send, missing required data')
|
||||
|
||||
|
||||
def get_email_date():
|
||||
@@ -220,7 +218,7 @@ def send_with_template(prefix, parm, test=None):
|
||||
def endjob(filename, cat, status, path, bytes, fail_msg, stages, script, script_output, script_ret, test=None):
|
||||
""" Send end-of-job email """
|
||||
# Is it allowed?
|
||||
if not check_cat('misc', cat, keyword='email') and not test:
|
||||
if not check_cat('email', cat):
|
||||
return None
|
||||
|
||||
# Translate the stage names
|
||||
|
||||
@@ -70,6 +70,19 @@ def yenc_name_fixer(p):
|
||||
return p.decode('cp1252', errors='replace').replace('?', '!')
|
||||
|
||||
|
||||
def is_utf8(p):
|
||||
""" Return True when p is UTF-8 or plain ASCII """
|
||||
utf8 = True
|
||||
try:
|
||||
p.decode('ascii')
|
||||
except:
|
||||
try:
|
||||
p.decode('utf-8')
|
||||
except:
|
||||
utf8 = False
|
||||
return utf8
|
||||
|
||||
|
||||
def special_fixer(p):
|
||||
""" Return string appropriate for the platform.
|
||||
Also takes care of the situation where a non-Windows/UTF-8 system
|
||||
@@ -205,11 +218,7 @@ def TRANS(p):
|
||||
"""
|
||||
global gTABLE_850_LATIN
|
||||
if sabnzbd.WIN32:
|
||||
if p:
|
||||
return p.translate(gTABLE_850_LATIN).decode('cp1252', 'replace')
|
||||
else:
|
||||
# translate() fails on empty or None strings
|
||||
return ''
|
||||
return p.translate(gTABLE_850_LATIN).decode('cp1252', 'replace')
|
||||
else:
|
||||
return unicoder(p)
|
||||
|
||||
@@ -220,11 +229,7 @@ def UNTRANS(p):
|
||||
"""
|
||||
global gTABLE_LATIN_850
|
||||
if sabnzbd.WIN32:
|
||||
if p:
|
||||
return p.encode('cp1252', 'replace').translate(gTABLE_LATIN_850)
|
||||
else:
|
||||
# translate() fails on empty or None strings
|
||||
return ''
|
||||
return p.encode('cp1252', 'replace').translate(gTABLE_LATIN_850)
|
||||
else:
|
||||
return p
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ import sabnzbd.scheduler as scheduler
|
||||
|
||||
from Cheetah.Template import Template
|
||||
from sabnzbd.misc import real_path, to_units, from_units, \
|
||||
time_format, long_path, calc_age, same_file, \
|
||||
time_format, long_path, calc_age, \
|
||||
cat_to_opts, int_conv, globber, globber_full, remove_all, get_base_url
|
||||
from sabnzbd.newswrapper import GetServerParms
|
||||
from sabnzbd.rating import Rating
|
||||
@@ -1373,7 +1373,7 @@ class ConfigSwitches(object):
|
||||
SPECIAL_BOOL_LIST = \
|
||||
('start_paused', 'no_penalties', 'ignore_wrong_unrar', 'overwrite_files', 'enable_par_cleanup',
|
||||
'queue_complete_pers', 'api_warnings', 'ampm', 'enable_unrar', 'enable_unzip', 'enable_7zip',
|
||||
'enable_filejoin', 'enable_tsjoin', 'ignore_unrar_dates', 'debug_log_decoding',
|
||||
'enable_filejoin', 'enable_tsjoin', 'ignore_unrar_dates',
|
||||
'multipar', 'osx_menu', 'osx_speed', 'win_menu', 'use_pickle', 'allow_incomplete_nzb',
|
||||
'rss_filenames', 'ipv6_hosting', 'keep_awake', 'empty_postproc', 'html_login', 'wait_for_dfolder',
|
||||
'max_art_opt', 'warn_empty_nzb', 'enable_bonjour', 'reject_duplicate_files', 'warn_dupl_jobs',
|
||||
@@ -2349,17 +2349,12 @@ class ConfigCats(object):
|
||||
else:
|
||||
newname = re.sub('"', '', kwargs.get('newname', ''))
|
||||
if newname:
|
||||
if kwargs.get('dir'):
|
||||
kwargs['dir'] = platform_encode(kwargs['dir'])
|
||||
|
||||
# Check if this cat-dir is not sub-folder of incomplete
|
||||
if same_file(cfg.download_dir.get_path(), real_path(cfg.complete_dir.get_path(), kwargs['dir'])):
|
||||
return T('Category folder cannot be a subfolder of the Temporary Download Folder.')
|
||||
|
||||
# Delete current one and replace with new one
|
||||
if name:
|
||||
config.delete('categories', name)
|
||||
config.ConfigCat(newname.lower(), kwargs)
|
||||
name = newname.lower()
|
||||
if kwargs.get('dir'):
|
||||
kwargs['dir'] = platform_encode(kwargs['dir'])
|
||||
config.ConfigCat(name, kwargs)
|
||||
|
||||
config.save_config()
|
||||
raise Raiser(self.__root)
|
||||
@@ -2739,7 +2734,7 @@ LIST_PROWL = ('prowl_enable', 'prowl_cats', 'prowl_apikey',
|
||||
LIST_PUSHOVER = ('pushover_enable', 'pushover_cats', 'pushover_token', 'pushover_userkey', 'pushover_device',
|
||||
'pushover_prio_startup', 'pushover_prio_download', 'pushover_prio_pp', 'pushover_prio_complete', 'pushover_prio_failed',
|
||||
'pushover_prio_disk_full', 'pushover_prio_warning', 'pushover_prio_error', 'pushover_prio_queue_done', 'pushover_prio_other',
|
||||
'pushover_prio_new_login', 'pushover_emergency_retry', 'pushover_emergency_expire')
|
||||
'pushover_prio_new_login')
|
||||
LIST_PUSHBULLET = ('pushbullet_enable', 'pushbullet_cats', 'pushbullet_apikey', 'pushbullet_device',
|
||||
'pushbullet_prio_startup', 'pushbullet_prio_download', 'pushbullet_prio_pp', 'pushbullet_prio_complete', 'pushbullet_prio_failed',
|
||||
'pushbullet_prio_disk_full', 'pushbullet_prio_warning', 'pushbullet_prio_error', 'pushbullet_prio_queue_done', 'pushbullet_prio_other',
|
||||
|
||||
@@ -29,11 +29,10 @@ import threading
|
||||
import subprocess
|
||||
import socket
|
||||
import time
|
||||
import calendar
|
||||
import datetime
|
||||
import fnmatch
|
||||
import stat
|
||||
import inspect
|
||||
import urllib2
|
||||
from urlparse import urlparse
|
||||
|
||||
import sabnzbd
|
||||
@@ -168,7 +167,7 @@ def cat_to_opts(cat, pp=None, script=None, priority=None):
|
||||
if safe_lower(script) in ('', 'default'):
|
||||
script = def_cat.script()
|
||||
|
||||
if priority is None or priority == '' or priority == DEFAULT_PRIORITY:
|
||||
if priority is None or priority == DEFAULT_PRIORITY:
|
||||
priority = my_cat.priority()
|
||||
if priority == DEFAULT_PRIORITY:
|
||||
priority = def_cat.priority()
|
||||
@@ -738,12 +737,12 @@ def from_units(val):
|
||||
return 0.0
|
||||
|
||||
|
||||
def to_units(val, spaces=0, postfix=''):
|
||||
def to_units(val, spaces=0, dec_limit=2, postfix=''):
|
||||
""" Convert number to K/M/G/T/P notation
|
||||
Add "spaces" if not ending in letter
|
||||
Show single decimal for M and higher
|
||||
dig_limit==1 show single decimal for M and higher
|
||||
dig_limit==2 show single decimal for G and higher
|
||||
"""
|
||||
dec_limit = 1
|
||||
decimals = 0
|
||||
if val < 0:
|
||||
sign = '-'
|
||||
@@ -771,31 +770,6 @@ def to_units(val, spaces=0, postfix=''):
|
||||
return fmt % (sign, val, unit, postfix)
|
||||
|
||||
|
||||
def caller_name(skip=2):
|
||||
"""Get a name of a caller in the format module.method
|
||||
Originally used: https://gist.github.com/techtonik/2151727
|
||||
Adapted for speed by using sys calls directly
|
||||
"""
|
||||
# Only do the tracing on Debug (function is always called)
|
||||
if cfg.log_level() != 2:
|
||||
return 'N/A'
|
||||
|
||||
parentframe = sys._getframe(skip)
|
||||
function_name = parentframe.f_code.co_name
|
||||
|
||||
# Modulename not available in the binaries, we can use the filename instead
|
||||
if getattr(sys, 'frozen', None):
|
||||
module_name = inspect.getfile(parentframe)
|
||||
else:
|
||||
module_name = inspect.getmodule(parentframe).__name__
|
||||
|
||||
# For decorated functions we have to go deeper
|
||||
if function_name in ('call_func', 'wrap') and skip == 2:
|
||||
return caller_name(4)
|
||||
|
||||
return ".".join([module_name, function_name])
|
||||
|
||||
|
||||
def same_file(a, b):
|
||||
""" Return 0 if A and B have nothing in common
|
||||
return 1 if A and B are actually the same path
|
||||
@@ -846,14 +820,6 @@ def split_host(srv):
|
||||
return (host, port)
|
||||
|
||||
|
||||
def get_from_url(url):
|
||||
""" Retrieve URL and return content """
|
||||
try:
|
||||
return urllib2.urlopen(url).read()
|
||||
except:
|
||||
return None
|
||||
|
||||
|
||||
def check_mount(path):
|
||||
""" Return False if volume isn't mounted on Linux or OSX
|
||||
Retry 6 times with an interval of 1 sec.
|
||||
@@ -957,7 +923,7 @@ def move_to_path(path, new_path):
|
||||
new_path = os.path.abspath(new_path)
|
||||
if overwrite and os.path.exists(new_path):
|
||||
try:
|
||||
remove_file(new_path)
|
||||
os.remove(new_path)
|
||||
except:
|
||||
overwrite = False
|
||||
if not overwrite:
|
||||
@@ -975,7 +941,7 @@ def move_to_path(path, new_path):
|
||||
if not os.path.exists(os.path.dirname(new_path)):
|
||||
create_dirs(os.path.dirname(new_path))
|
||||
shutil.copyfile(path, new_path)
|
||||
remove_file(path)
|
||||
os.remove(path)
|
||||
except:
|
||||
# Check if the old-file actually exists (possible delete-delays)
|
||||
if not os.path.exists(path):
|
||||
@@ -1090,11 +1056,12 @@ def renamer(old, new):
|
||||
@synchronized(DIR_LOCK)
|
||||
def remove_dir(path):
|
||||
""" Remove directory with retries for Win32 """
|
||||
logging.debug('Removing dir %s', path)
|
||||
if sabnzbd.WIN32:
|
||||
retries = 15
|
||||
while retries > 0:
|
||||
try:
|
||||
remove_dir(path)
|
||||
os.rmdir(path)
|
||||
return
|
||||
except WindowsError, err:
|
||||
if err[0] == 32:
|
||||
@@ -1105,7 +1072,7 @@ def remove_dir(path):
|
||||
time.sleep(3)
|
||||
raise WindowsError(err)
|
||||
else:
|
||||
remove_dir(path)
|
||||
os.rmdir(path)
|
||||
|
||||
|
||||
@synchronized(DIR_LOCK)
|
||||
@@ -1119,30 +1086,20 @@ def remove_all(path, pattern='*', keep_folder=False, recursive=False):
|
||||
for f in files:
|
||||
if os.path.isfile(f):
|
||||
try:
|
||||
remove_file(f)
|
||||
logging.debug('Removing file %s', f)
|
||||
os.remove(f)
|
||||
except:
|
||||
logging.info('Cannot remove file %s', f)
|
||||
elif recursive:
|
||||
remove_all(f, pattern, False, True)
|
||||
if not keep_folder:
|
||||
try:
|
||||
remove_dir(path)
|
||||
logging.debug('Removing dir %s', path)
|
||||
os.rmdir(path)
|
||||
except:
|
||||
logging.info('Cannot remove folder %s', path)
|
||||
|
||||
|
||||
def remove_file(path):
|
||||
""" Wrapper function so any file removal is logged """
|
||||
logging.debug('[%s] Deleting file %s', caller_name(), path)
|
||||
os.remove(path)
|
||||
|
||||
|
||||
def remove_dir(dir):
|
||||
""" Wrapper function so any dir removal is logged """
|
||||
logging.debug('[%s] Deleting dir %s', caller_name(), dir)
|
||||
os.rmdir(dir)
|
||||
|
||||
|
||||
def trim_win_path(path):
|
||||
""" Make sure Windows path stays below 70 by trimming last part """
|
||||
if sabnzbd.WIN32 and len(path) > 69:
|
||||
|
||||
@@ -33,7 +33,7 @@ from sabnzbd.encoding import TRANS, UNTRANS, unicoder, platform_encode, deunicod
|
||||
import sabnzbd.utils.rarfile as rarfile
|
||||
from sabnzbd.misc import format_time_string, find_on_path, make_script_path, int_conv, \
|
||||
real_path, globber, globber_full, get_all_passwords, renamer, clip_path, \
|
||||
has_win_device, calc_age, long_path, remove_file
|
||||
has_win_device, calc_age, long_path
|
||||
from sabnzbd.tvsort import SeriesSorter
|
||||
import sabnzbd.cfg as cfg
|
||||
from sabnzbd.constants import Status
|
||||
@@ -43,11 +43,10 @@ if sabnzbd.WIN32:
|
||||
import win32api
|
||||
from win32con import SW_HIDE
|
||||
from win32process import STARTF_USESHOWWINDOW, IDLE_PRIORITY_CLASS
|
||||
|
||||
# Use patched version of subprocess module for Unicode on Windows
|
||||
import subprocessww
|
||||
except ImportError:
|
||||
pass
|
||||
# Load the POpen from the fixed unicode-subprocess
|
||||
from sabnzbd.utils.subprocess_fix import Popen
|
||||
else:
|
||||
# Define dummy WindowsError for non-Windows
|
||||
class WindowsError(Exception):
|
||||
@@ -56,9 +55,8 @@ else:
|
||||
|
||||
def __str__(self):
|
||||
return repr(self.parameter)
|
||||
|
||||
# Load the regular POpen (which is now patched on Windows)
|
||||
from subprocess import Popen
|
||||
# Load the regular POpen
|
||||
from subprocess import Popen
|
||||
|
||||
# Regex globals
|
||||
RAR_RE = re.compile(r'\.(?P<ext>part\d*\.rar|rar|r\d\d|s\d\d|t\d\d|u\d\d|v\d\d|\d\d\d)$', re.I)
|
||||
@@ -67,7 +65,6 @@ RAR_RE_V3 = re.compile(r'\.(?P<ext>part\d*)$', re.I)
|
||||
LOADING_RE = re.compile(r'^Loading "(.+)"')
|
||||
TARGET_RE = re.compile(r'^(?:File|Target): "(.+)" -')
|
||||
EXTRACTFROM_RE = re.compile(r'^Extracting\sfrom\s(.+)')
|
||||
EXTRACTED_RE = re.compile(r'^(Extracting|Creating|...)\s+(.*?)\s+OK\s*$')
|
||||
SPLITFILE_RE = re.compile(r'\.(\d\d\d$)', re.I)
|
||||
ZIP_RE = re.compile(r'\.(zip$)', re.I)
|
||||
SEVENZIP_RE = re.compile(r'\.7z$', re.I)
|
||||
@@ -110,6 +107,7 @@ def find_programs(curdir):
|
||||
sabnzbd.newsunpack.MULTIPAR_COMMAND = check(curdir, 'win/par2/multipar/par2j.exe')
|
||||
sabnzbd.newsunpack.RAR_COMMAND = check(curdir, 'win/unrar/UnRAR.exe')
|
||||
sabnzbd.newsunpack.PAR2_COMMAND = check(curdir, 'win/par2/par2.exe')
|
||||
sabnzbd.newsunpack.ZIP_COMMAND = check(curdir, 'win/unzip/unzip.exe')
|
||||
sabnzbd.newsunpack.SEVEN_COMMAND = check(curdir, 'win/7zip/7za.exe')
|
||||
else:
|
||||
if not sabnzbd.newsunpack.PAR2_COMMAND:
|
||||
@@ -141,12 +139,12 @@ ENV_NZO_FIELDS = ['bytes', 'bytes_downloaded', 'bytes_tried', 'cat', 'duplicate'
|
||||
|
||||
def external_processing(extern_proc, nzo, complete_dir, nicename, status):
|
||||
""" Run a user postproc script, return console output and exit value """
|
||||
failure_url = nzo.nzo_info.get('failure', '')
|
||||
command = [str(extern_proc), str(complete_dir), str(nzo.filename), str(nicename), '',
|
||||
str(nzo.cat), str(nzo.group), str(status), str(failure_url)]
|
||||
command = [str(extern_proc), str(complete_dir), str(nzo.filename),
|
||||
str(nicename), '', str(nzo.cat), str(nzo.group), str(status)]
|
||||
|
||||
# Add path to original NZB
|
||||
nzb_paths = globber_full(nzo.workpath, '*.gz')
|
||||
failure_url = nzo.nzo_info.get('failure', '')
|
||||
if failure_url:
|
||||
command.append(str(failure_url))
|
||||
|
||||
# Fields not in the NZO directly
|
||||
extra_env_fields = {'failure_url': failure_url,
|
||||
@@ -155,13 +153,6 @@ def external_processing(extern_proc, nzo, complete_dir, nicename, status):
|
||||
'download_time': nzo.nzo_info.get('download_time', ''),
|
||||
'avg_bps': int(nzo.avg_bps_total / nzo.avg_bps_freq) if nzo.avg_bps_freq else 0,
|
||||
'age': calc_age(nzo.avg_date),
|
||||
'orig_nzb_gz': clip_path(nzb_paths[0]) if nzb_paths else '',
|
||||
'program_dir': sabnzbd.DIR_PROG,
|
||||
'par2_command': sabnzbd.newsunpack.PAR2_COMMAND,
|
||||
'multipar_command': sabnzbd.newsunpack.MULTIPAR_COMMAND,
|
||||
'rar_command': sabnzbd.newsunpack.RAR_COMMAND,
|
||||
'zip_command': sabnzbd.newsunpack.ZIP_COMMAND,
|
||||
'7zip_command': sabnzbd.newsunpack.SEVEN_COMMAND,
|
||||
'version': sabnzbd.__version__}
|
||||
|
||||
try:
|
||||
@@ -187,9 +178,6 @@ def external_processing(extern_proc, nzo, complete_dir, nicename, status):
|
||||
line = line.strip()
|
||||
lines.append(line)
|
||||
|
||||
# Show current line in history
|
||||
nzo.set_action_line(T('Running script'), unicoder(line))
|
||||
|
||||
# Check if we should still continue
|
||||
if not nzo.pp_active:
|
||||
p.kill()
|
||||
@@ -267,6 +255,16 @@ def unpack_magic(nzo, workdir, workdir_complete, dele, one_folder, joinables, zi
|
||||
nzo.set_action_line()
|
||||
rerun = not error
|
||||
|
||||
if cfg.enable_unzip():
|
||||
new_zips = [zip for zip in xzips if zip not in zips]
|
||||
if new_zips:
|
||||
logging.info('Unzip starting on %s', workdir)
|
||||
if unzip(nzo, workdir, workdir_complete, dele, one_folder, new_zips):
|
||||
error = 1
|
||||
logging.info('Unzip finished on %s', workdir)
|
||||
nzo.set_action_line()
|
||||
rerun = not error
|
||||
|
||||
if cfg.enable_7zip():
|
||||
new_sevens = [seven for seven in xsevens if seven not in sevens]
|
||||
if new_sevens:
|
||||
@@ -277,20 +275,6 @@ def unpack_magic(nzo, workdir, workdir_complete, dele, one_folder, joinables, zi
|
||||
nzo.set_action_line()
|
||||
rerun = not error
|
||||
|
||||
if cfg.enable_unzip():
|
||||
new_zips = [zip for zip in xzips if zip not in zips]
|
||||
if new_zips:
|
||||
logging.info('Unzip starting on %s', workdir)
|
||||
if SEVEN_COMMAND:
|
||||
if unseven(nzo, workdir, workdir_complete, dele, one_folder, new_zips):
|
||||
error = True
|
||||
else:
|
||||
if unzip(nzo, workdir, workdir_complete, dele, one_folder, new_zips):
|
||||
error = True
|
||||
logging.info('Unzip finished on %s', workdir)
|
||||
nzo.set_action_line()
|
||||
rerun = not error
|
||||
|
||||
if cfg.enable_tsjoin():
|
||||
new_ts = [_ts for _ts in xts if _ts not in ts]
|
||||
if new_ts:
|
||||
@@ -346,14 +330,16 @@ def clean_up_joinables(names):
|
||||
""" Remove joinable files and their .1 backups """
|
||||
for name in names:
|
||||
if os.path.exists(name):
|
||||
logging.debug("Deleting %s", name)
|
||||
try:
|
||||
remove_file(name)
|
||||
os.remove(name)
|
||||
except:
|
||||
pass
|
||||
name1 = name + ".1"
|
||||
if os.path.exists(name1):
|
||||
logging.debug("Deleting %s", name1)
|
||||
try:
|
||||
remove_file(name1)
|
||||
os.remove(name1)
|
||||
except:
|
||||
pass
|
||||
|
||||
@@ -429,7 +415,8 @@ def file_join(nzo, workdir, workdir_complete, delete, joinables):
|
||||
shutil.copyfileobj(f, joined_file, bufsize)
|
||||
f.close()
|
||||
if delete:
|
||||
remove_file(joinable)
|
||||
logging.debug("Deleting %s", joinable)
|
||||
os.remove(joinable)
|
||||
n += 1
|
||||
|
||||
# Remove any remaining .1 files
|
||||
@@ -493,30 +480,20 @@ def rar_unpack(nzo, workdir, workdir_complete, delete, one_folder, rars):
|
||||
|
||||
# Is the direct-unpacker still running? We wait for it
|
||||
if nzo.direct_unpacker:
|
||||
wait_count = 0
|
||||
last_stats = nzo.direct_unpacker.get_formatted_stats()
|
||||
while nzo.direct_unpacker.is_alive():
|
||||
logging.debug('DirectUnpacker still alive for %s: %s', nzo.work_name, last_stats)
|
||||
|
||||
logging.debug('DirectUnpacker still alive for %s', nzo)
|
||||
# Bump the file-lock in case it's stuck
|
||||
with nzo.direct_unpacker.next_file_lock:
|
||||
nzo.direct_unpacker.next_file_lock.notify()
|
||||
time.sleep(2)
|
||||
|
||||
# Did something change? Might be stuck
|
||||
if last_stats == nzo.direct_unpacker.get_formatted_stats():
|
||||
wait_count += 1
|
||||
if wait_count > 60:
|
||||
# We abort after 2 minutes of no changes
|
||||
nzo.direct_unpacker.abort()
|
||||
last_stats = nzo.direct_unpacker.get_formatted_stats()
|
||||
|
||||
# Did we already direct-unpack it? Not when recursive-unpacking
|
||||
if nzo.direct_unpacker and rar_set in nzo.direct_unpacker.success_sets:
|
||||
logging.info("Set %s completed by DirectUnpack", rar_set)
|
||||
fail = False
|
||||
success = True
|
||||
rars, newfiles = nzo.direct_unpacker.success_sets.pop(rar_set)
|
||||
rars = nzo.direct_unpacker.success_sets.pop(rar_set)
|
||||
newfiles = globber(extraction_path)
|
||||
else:
|
||||
logging.info("Extracting rarfile %s (belonging to %s) to %s",
|
||||
rarpath, rar_set, extraction_path)
|
||||
@@ -564,8 +541,9 @@ def rar_unpack(nzo, workdir, workdir_complete, delete, one_folder, rars):
|
||||
# Delete the old files if we have to
|
||||
if success and delete and newfiles:
|
||||
for rar in rars:
|
||||
logging.info("Deleting %s", rar)
|
||||
try:
|
||||
remove_file(rar)
|
||||
os.remove(rar)
|
||||
except OSError:
|
||||
if os.path.exists(rar):
|
||||
logging.warning(T('Deleting %s failed!'), rar)
|
||||
@@ -575,7 +553,7 @@ def rar_unpack(nzo, workdir, workdir_complete, delete, one_folder, rars):
|
||||
if os.path.exists(brokenrar):
|
||||
logging.info("Deleting %s", brokenrar)
|
||||
try:
|
||||
remove_file(brokenrar)
|
||||
os.remove(brokenrar)
|
||||
except OSError:
|
||||
if os.path.exists(brokenrar):
|
||||
logging.warning(T('Deleting %s failed!'), brokenrar)
|
||||
@@ -635,10 +613,18 @@ def rar_extract_core(rarfile_path, numrars, one_folder, nzo, setname, extraction
|
||||
rename = '-or' # Auto renaming
|
||||
|
||||
if sabnzbd.WIN32:
|
||||
# For Unrar to support long-path, we need to cricumvent Python's list2cmdline
|
||||
# See: https://github.com/sabnzbd/sabnzbd/issues/1043
|
||||
command = ['%s' % RAR_COMMAND, action, '-idp', overwrite, rename, '-ai', password_command,
|
||||
'%s' % clip_path(rarfile_path), '%s\\' % long_path(extraction_path)]
|
||||
# Use all flags
|
||||
if not has_win_device(rarfile_path):
|
||||
command = ['%s' % RAR_COMMAND, action, '-idp', overwrite, rename, '-ai', password_command,
|
||||
'%s' % clip_path(rarfile_path), clip_path(extraction_path)]
|
||||
else:
|
||||
# Need long-path notation in case of forbidden-names
|
||||
command = ['%s' % RAR_COMMAND, action, '-idp', overwrite, rename, '-ai', password_command,
|
||||
'%s' % clip_path(rarfile_path), '%s\\' % extraction_path]
|
||||
|
||||
# The subprocess_fix requires time to clear the buffers to work,
|
||||
# otherwise the inputs get send incorrectly and unrar breaks
|
||||
time.sleep(0.5)
|
||||
|
||||
elif RAR_PROBLEM:
|
||||
# Use only oldest options (specifically no "-or")
|
||||
@@ -652,7 +638,7 @@ def rar_extract_core(rarfile_path, numrars, one_folder, nzo, setname, extraction
|
||||
if cfg.ignore_unrar_dates():
|
||||
command.insert(3, '-tsm-')
|
||||
|
||||
stup, need_shell, command, creationflags = build_command(command, flatten_command=True)
|
||||
stup, need_shell, command, creationflags = build_command(command)
|
||||
|
||||
# Get list of all the volumes part of this set
|
||||
logging.debug("Analyzing rar file ... %s found", rarfile.is_rarfile(rarfile_path))
|
||||
@@ -805,13 +791,9 @@ def rar_extract_core(rarfile_path, numrars, one_folder, nzo, setname, extraction
|
||||
fail = 3
|
||||
|
||||
else:
|
||||
m = re.search(EXTRACTED_RE, line)
|
||||
m = re.search(r'^(Extracting|Creating|...)\s+(.*?)\s+OK\s*$', line)
|
||||
if m:
|
||||
# In case of flat-unpack, UnRar still prints the whole path (?!)
|
||||
unpacked_file = TRANS(m.group(2))
|
||||
if cfg.flat_unpack():
|
||||
unpacked_file = os.path.basename(unpacked_file)
|
||||
extracted.append(real_path(extraction_path, unpacked_file))
|
||||
extracted.append(real_path(extraction_path, TRANS(m.group(2))))
|
||||
|
||||
if fail:
|
||||
if proc:
|
||||
@@ -871,8 +853,9 @@ def unzip(nzo, workdir, workdir_complete, delete, one_folder, zips):
|
||||
i = 0
|
||||
|
||||
for _zip in zips:
|
||||
logging.info("Deleting %s", _zip)
|
||||
try:
|
||||
remove_file(_zip)
|
||||
os.remove(_zip)
|
||||
i += 1
|
||||
except OSError:
|
||||
logging.warning(T('Deleting %s failed!'), _zip)
|
||||
@@ -880,8 +863,9 @@ def unzip(nzo, workdir, workdir_complete, delete, one_folder, zips):
|
||||
brokenzip = '%s.1' % _zip
|
||||
|
||||
if os.path.exists(brokenzip):
|
||||
logging.info("Deleting %s", brokenzip)
|
||||
try:
|
||||
remove_file(brokenzip)
|
||||
os.remove(brokenzip)
|
||||
i += 1
|
||||
except OSError:
|
||||
logging.warning(T('Deleting %s failed!'), brokenzip)
|
||||
@@ -1016,7 +1000,7 @@ def seven_extract_core(sevenset, extensions, extraction_path, one_folder, delete
|
||||
parm = '-tsplit'
|
||||
else:
|
||||
name = sevenset
|
||||
parm = '-tzip' if sevenset.lower().endswith('.zip') else '-t7z'
|
||||
parm = '-t7z'
|
||||
|
||||
if not os.path.exists(name):
|
||||
return 1, T('7ZIP set "%s" is incomplete, cannot unpack') % unicoder(sevenset)
|
||||
@@ -1040,12 +1024,12 @@ def seven_extract_core(sevenset, extensions, extraction_path, one_folder, delete
|
||||
for ext in extensions:
|
||||
path = '%s.%s' % (sevenset, ext)
|
||||
try:
|
||||
remove_file(path)
|
||||
os.remove(path)
|
||||
except:
|
||||
logging.warning(T('Deleting %s failed!'), path)
|
||||
else:
|
||||
try:
|
||||
remove_file(sevenset)
|
||||
os.remove(sevenset)
|
||||
except:
|
||||
logging.warning(T('Deleting %s failed!'), sevenset)
|
||||
|
||||
@@ -1093,8 +1077,9 @@ def par2_repair(parfile_nzf, nzo, workdir, setname, single):
|
||||
# Download all par2 files that haven't been downloaded yet
|
||||
readd = False
|
||||
for extrapar in nzo.extrapars[setname][:]:
|
||||
nzo.add_parfile(extrapar)
|
||||
readd = True
|
||||
if extrapar not in nzo.finished_files and extrapar not in nzo.files:
|
||||
nzo.add_parfile(extrapar)
|
||||
readd = True
|
||||
if readd:
|
||||
return readd, result
|
||||
|
||||
@@ -1161,8 +1146,9 @@ def par2_repair(parfile_nzf, nzo, workdir, setname, single):
|
||||
if filepath in joinables:
|
||||
joinables.remove(filepath)
|
||||
if os.path.exists(filepath):
|
||||
logging.info("Deleting %s", filepath)
|
||||
try:
|
||||
remove_file(filepath)
|
||||
os.remove(filepath)
|
||||
except OSError:
|
||||
logging.warning(T('Deleting %s failed!'), filepath)
|
||||
except:
|
||||
@@ -1310,10 +1296,8 @@ def PAR_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False):
|
||||
verifynum = 0
|
||||
|
||||
elif line.startswith('Main packet not found') or 'The recovery file does not exist' in line:
|
||||
# Initialparfile probably didn't decode properly or bad user parameters
|
||||
# We will try to get another par2 file, but 99% of time it's user parameters
|
||||
msg = T('Invalid par2 files or invalid PAR2 parameters, cannot verify or repair')
|
||||
logging.info(msg)
|
||||
# Initialparfile probably didn't decode properly,
|
||||
logging.info(T('Main packet not found...'))
|
||||
logging.info("Extra pars = %s", nzo.extrapars[setname])
|
||||
|
||||
# Look for the smallest par2file
|
||||
@@ -1331,6 +1315,7 @@ def PAR_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False):
|
||||
nzo.add_parfile(nzf)
|
||||
readd = True
|
||||
else:
|
||||
msg = T('Invalid par2 files or invalid PAR2 parameters, cannot verify or repair')
|
||||
nzo.fail_msg = msg
|
||||
msg = u'[%s] %s' % (unicoder(setname), msg)
|
||||
nzo.set_unpack_info('Repair', msg)
|
||||
@@ -1346,6 +1331,7 @@ def PAR_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False):
|
||||
if added_blocks:
|
||||
msg = T('Fetching %s blocks...') % str(added_blocks)
|
||||
nzo.set_action_line(T('Fetching'), msg)
|
||||
nzo.status = Status.FETCHING
|
||||
readd = True
|
||||
else:
|
||||
# Failed
|
||||
@@ -1454,15 +1440,6 @@ def PAR_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False):
|
||||
nzo.set_unpack_info('Repair', msg)
|
||||
nzo.status = Status.FAILED
|
||||
|
||||
elif line.startswith('Repair Failed.'):
|
||||
# Unknown repair problem
|
||||
msg = T('Repairing failed, %s') % line
|
||||
nzo.fail_msg = msg
|
||||
msg = u'[%s] %s' % (unicoder(setname), msg)
|
||||
nzo.set_unpack_info('Repair', msg)
|
||||
nzo.status = Status.FAILED
|
||||
finished = 0
|
||||
|
||||
elif not verified:
|
||||
if line.startswith('Verifying source files'):
|
||||
nzo.set_action_line(T('Verifying'), '01/%02d' % verifytotal)
|
||||
@@ -1497,10 +1474,6 @@ def PAR_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False):
|
||||
except WindowsError, err:
|
||||
raise WindowsError(err)
|
||||
|
||||
# Also log what is shown to user in history
|
||||
if nzo.fail_msg:
|
||||
logging.info(nzo.fail_msg)
|
||||
|
||||
logging.debug('PAR2 output was\n%s', '\n'.join(lines))
|
||||
|
||||
# If successful, add renamed files to the collection
|
||||
@@ -1530,16 +1503,9 @@ def MultiPar_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False)
|
||||
# But not really required due to prospective-par2
|
||||
command = [str(MULTIPAR_COMMAND), 'r', '-vs2', '-vd%s' % parfolder, parfile]
|
||||
|
||||
# Check if there are maybe par2cmdline/par2tbb commands supplied
|
||||
if '-t' in cfg.par_option() or '-p' in cfg.par_option():
|
||||
logging.info('Removing old par2cmdline/par2tbb options for MultiPar')
|
||||
cfg.par_option.set('')
|
||||
|
||||
# Only add user-options if supplied
|
||||
options = cfg.par_option().strip()
|
||||
if options:
|
||||
# We wrongly instructed users to use /x parameter style instead of -x
|
||||
options = options.replace('/', '-', 1)
|
||||
command.insert(2, options)
|
||||
|
||||
# Append the wildcard for this set
|
||||
@@ -1623,10 +1589,8 @@ def MultiPar_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False)
|
||||
logging.error(msg)
|
||||
|
||||
elif line.startswith('valid file is not found'):
|
||||
# Initialparfile probably didn't decode properly, or bad user parameters
|
||||
# We will try to get another par2 file, but 99% of time it's user parameters
|
||||
msg = T('Invalid par2 files or invalid PAR2 parameters, cannot verify or repair')
|
||||
logging.info(msg)
|
||||
# Initialparfile probably didn't decode properly,
|
||||
logging.info(T('Main packet not found...'))
|
||||
logging.info("Extra pars = %s", nzo.extrapars[setname])
|
||||
|
||||
# Look for the smallest par2file
|
||||
@@ -1644,6 +1608,7 @@ def MultiPar_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False)
|
||||
nzo.add_parfile(nzf)
|
||||
readd = True
|
||||
else:
|
||||
msg = T('Invalid par2 files or invalid PAR2 parameters, cannot verify or repair')
|
||||
nzo.fail_msg = msg
|
||||
msg = u'[%s] %s' % (unicoder(setname), msg)
|
||||
nzo.set_unpack_info('Repair', msg)
|
||||
@@ -1788,6 +1753,7 @@ def MultiPar_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False)
|
||||
if added_blocks:
|
||||
msg = T('Fetching %s blocks...') % str(added_blocks)
|
||||
nzo.set_action_line(T('Fetching'), msg)
|
||||
nzo.status = Status.FETCHING
|
||||
readd = True
|
||||
else:
|
||||
# Failed
|
||||
@@ -1856,21 +1822,9 @@ def MultiPar_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False)
|
||||
verifynum += 1
|
||||
nzo.set_action_line(T('Verifying repair'), '%02d/%02d' % (verifynum, verifytotal))
|
||||
|
||||
elif line.startswith('Failed to repair'):
|
||||
# Unknown repair problem
|
||||
msg = T('Repairing failed, %s') % line
|
||||
nzo.fail_msg = msg
|
||||
msg = u'[%s] %s' % (unicoder(setname), msg)
|
||||
nzo.set_unpack_info('Repair', msg)
|
||||
nzo.status = Status.FAILED
|
||||
finished = 0
|
||||
|
||||
p.wait()
|
||||
|
||||
# Also log what is shown to user in history
|
||||
if nzo.fail_msg:
|
||||
logging.info(nzo.fail_msg)
|
||||
|
||||
logging.debug('MultiPar output was\n%s', '\n'.join(lines))
|
||||
|
||||
# Add renamed files to the collection
|
||||
@@ -1900,7 +1854,6 @@ def create_env(nzo=None, extra_env_fields=None):
|
||||
|
||||
# Are we adding things?
|
||||
if nzo:
|
||||
# Add basic info
|
||||
for field in ENV_NZO_FIELDS:
|
||||
try:
|
||||
field_value = getattr(nzo, field)
|
||||
@@ -1910,18 +1863,14 @@ def create_env(nzo=None, extra_env_fields=None):
|
||||
elif isinstance(field_value, bool):
|
||||
env['SAB_' + field.upper()] = str(field_value*1)
|
||||
else:
|
||||
env['SAB_' + field.upper()] = str(field_value)
|
||||
env['SAB_' + field.upper()] = str(deunicode(field_value))
|
||||
except:
|
||||
# Catch key/unicode errors
|
||||
pass
|
||||
|
||||
# Add extra fields
|
||||
for field in extra_env_fields:
|
||||
try:
|
||||
if extra_env_fields[field] is not None:
|
||||
env['SAB_' + field.upper()] = str(extra_env_fields[field])
|
||||
else:
|
||||
env['SAB_' + field.upper()] = ''
|
||||
env['SAB_' + field.upper()] = str(deunicode(extra_env_fields[field]))
|
||||
except:
|
||||
# Catch key/unicode errors
|
||||
pass
|
||||
@@ -1934,9 +1883,6 @@ def create_env(nzo=None, extra_env_fields=None):
|
||||
elif not nzo:
|
||||
# No modification
|
||||
return None
|
||||
|
||||
# Have to make sure no Unicode slipped in somehow
|
||||
env = { deunicode(k): deunicode(v) for k, v in env.iteritems() }
|
||||
return env
|
||||
|
||||
|
||||
@@ -1954,10 +1900,8 @@ def userxbit(filename):
|
||||
return xbitset
|
||||
|
||||
|
||||
def build_command(command, flatten_command=False):
|
||||
""" Prepare list from running an external program
|
||||
On Windows we need to run our own list2cmdline for Unrar
|
||||
"""
|
||||
def build_command(command):
|
||||
""" Prepare list from running an external program """
|
||||
if not sabnzbd.WIN32:
|
||||
if command[0].endswith('.py'):
|
||||
with open(command[0], 'r') as script_file:
|
||||
@@ -2001,7 +1945,7 @@ def build_command(command, flatten_command=False):
|
||||
if need_shell and ' ' in command[0]:
|
||||
command[0] = win32api.GetShortPathName(command[0])
|
||||
|
||||
if need_shell or flatten_command:
|
||||
if need_shell:
|
||||
command = list2cmdline(command)
|
||||
|
||||
return stup, need_shell, command, creationflags
|
||||
@@ -2012,20 +1956,16 @@ def rar_volumelist(rarfile_path, password, known_volumes):
|
||||
and merge them with existing list, removing duplicates
|
||||
"""
|
||||
# UnRar is required to read some RAR files
|
||||
# RarFile can fail in special cases
|
||||
try:
|
||||
rarfile.UNRAR_TOOL = RAR_COMMAND
|
||||
zf = rarfile.RarFile(rarfile_path)
|
||||
rarfile.UNRAR_TOOL = RAR_COMMAND
|
||||
zf = rarfile.RarFile(rarfile_path)
|
||||
|
||||
# setpassword can fail due to bugs in RarFile
|
||||
if password:
|
||||
try:
|
||||
zf.setpassword(password)
|
||||
except:
|
||||
pass
|
||||
zf_volumes = zf.volumelist()
|
||||
except:
|
||||
zf_volumes = []
|
||||
# setpassword can fail due to bugs in RarFile
|
||||
if password:
|
||||
try:
|
||||
zf.setpassword(password)
|
||||
except:
|
||||
pass
|
||||
zf_volumes = zf.volumelist()
|
||||
|
||||
# Remove duplicates
|
||||
known_volumes_base = [os.path.basename(vol) for vol in known_volumes]
|
||||
@@ -2292,7 +2232,7 @@ def pre_queue(name, pp, cat, script, priority, size, groups):
|
||||
values = [1, name, pp, cat, script, priority, None]
|
||||
script_path = make_script_path(cfg.pre_script())
|
||||
if script_path:
|
||||
command = [script_path, name, pp, fix(cat), fix(script), priority, str(size), ' '.join(groups)]
|
||||
command = [script_path, name, fix(pp), fix(cat), fix(script), fix(priority), str(size), ' '.join(groups)]
|
||||
command.extend(analyse_show(name))
|
||||
|
||||
try:
|
||||
@@ -2313,7 +2253,7 @@ def pre_queue(name, pp, cat, script, priority, size, groups):
|
||||
n = 0
|
||||
for line in output.split('\n'):
|
||||
line = line.strip('\r\n \'"')
|
||||
if n < len(values):
|
||||
if n < len(values) and line:
|
||||
values[n] = TRANS(line)
|
||||
n += 1
|
||||
accept = int_conv(values[0])
|
||||
@@ -2333,11 +2273,24 @@ def list2cmdline(lst):
|
||||
for arg in lst:
|
||||
if not arg:
|
||||
nlst.append('""')
|
||||
else:
|
||||
elif (' ' in arg) or ('\t' in arg) or ('&' in arg) or ('|' in arg) or (';' in arg) or (',' in arg):
|
||||
nlst.append('"%s"' % arg)
|
||||
else:
|
||||
nlst.append(arg)
|
||||
return ' '.join(nlst)
|
||||
|
||||
|
||||
def get_from_url(url):
|
||||
""" Retrieve URL and return content
|
||||
`timeout` sets non-standard timeout
|
||||
"""
|
||||
import urllib2
|
||||
try:
|
||||
return urllib2.urlopen(url).read()
|
||||
except:
|
||||
return None
|
||||
|
||||
|
||||
def is_sevenfile(path):
|
||||
""" Return True if path has proper extension and 7Zip is installed """
|
||||
return SEVEN_COMMAND and os.path.splitext(path)[1].lower() == '.7z'
|
||||
|
||||
@@ -27,6 +27,7 @@ import socket
|
||||
import urllib2
|
||||
import httplib
|
||||
import urllib
|
||||
import time
|
||||
import subprocess
|
||||
import json
|
||||
from threading import Thread
|
||||
@@ -133,17 +134,13 @@ def get_prio(gtype, section):
|
||||
return -1000
|
||||
|
||||
|
||||
def check_cat(section, job_cat, keyword=None):
|
||||
""" Check if `job_cat` is enabled in `section`.
|
||||
* = All, if no other categories selected.
|
||||
"""
|
||||
def check_cat(section, job_cat):
|
||||
""" Check if `job_cat` is enabled in `section`. * = All """
|
||||
if not job_cat:
|
||||
return True
|
||||
try:
|
||||
if not keyword:
|
||||
keyword = section
|
||||
section_cats = sabnzbd.config.get_config(section, '%s_cats' % keyword)()
|
||||
return (['*'] == section_cats or job_cat in section_cats)
|
||||
section_cats = sabnzbd.config.get_config(section, '%s_cats' % section)()
|
||||
return ('*' in section_cats or job_cat in section_cats)
|
||||
except TypeError:
|
||||
logging.debug('Incorrect Notify option %s:%s_cats', section, section)
|
||||
return True
|
||||
@@ -167,26 +164,31 @@ def send_notification(title, msg, gtype, job_cat=None):
|
||||
return send_local_growl(title, msg, gtype)
|
||||
else:
|
||||
Thread(target=send_growl, args=(title, msg, gtype)).start()
|
||||
time.sleep(0.5)
|
||||
|
||||
# Prowl
|
||||
if sabnzbd.cfg.prowl_enable() and check_cat('prowl', job_cat):
|
||||
if sabnzbd.cfg.prowl_apikey():
|
||||
Thread(target=send_prowl, args=(title, msg, gtype)).start()
|
||||
time.sleep(0.5)
|
||||
|
||||
# Pushover
|
||||
if sabnzbd.cfg.pushover_enable() and check_cat('pushover', job_cat):
|
||||
if sabnzbd.cfg.pushover_token():
|
||||
Thread(target=send_pushover, args=(title, msg, gtype)).start()
|
||||
time.sleep(0.5)
|
||||
|
||||
# Pushbullet
|
||||
if sabnzbd.cfg.pushbullet_enable() and check_cat('pushbullet', job_cat):
|
||||
if sabnzbd.cfg.pushbullet_apikey() and check_classes(gtype, 'pushbullet'):
|
||||
Thread(target=send_pushbullet, args=(title, msg, gtype)).start()
|
||||
time.sleep(0.5)
|
||||
|
||||
# Notification script.
|
||||
if sabnzbd.cfg.nscript_enable() and check_cat('nscript', job_cat):
|
||||
if sabnzbd.cfg.nscript_script():
|
||||
Thread(target=send_nscript, args=(title, msg, gtype)).start()
|
||||
time.sleep(0.5)
|
||||
|
||||
# NTFOSD
|
||||
if have_ntfosd() and sabnzbd.cfg.ntfosd_enable():
|
||||
@@ -441,8 +443,6 @@ def send_pushover(title, msg, gtype, force=False, test=None):
|
||||
apikey = sabnzbd.cfg.pushover_token()
|
||||
userkey = sabnzbd.cfg.pushover_userkey()
|
||||
device = sabnzbd.cfg.pushover_device()
|
||||
emergency_retry = sabnzbd.cfg.pushover_emergency_retry()
|
||||
emergency_expire = sabnzbd.cfg.pushover_emergency_expire()
|
||||
if not apikey or not userkey:
|
||||
return T('Cannot send, missing required data')
|
||||
|
||||
@@ -452,42 +452,27 @@ def send_pushover(title, msg, gtype, force=False, test=None):
|
||||
if force:
|
||||
prio = 1
|
||||
|
||||
if prio == 2:
|
||||
body = { "token": apikey,
|
||||
"user": userkey,
|
||||
"device": device,
|
||||
"title": title,
|
||||
"message": msg,
|
||||
"priority": prio,
|
||||
"retry": emergency_retry,
|
||||
"expire": emergency_expire
|
||||
}
|
||||
return do_send_pushover(body)
|
||||
if prio > -3 and prio < 2:
|
||||
body = { "token": apikey,
|
||||
"user": userkey,
|
||||
"device": device,
|
||||
"title": title,
|
||||
"message": msg,
|
||||
"priority": prio,
|
||||
}
|
||||
return do_send_pushover(body)
|
||||
if prio > -3:
|
||||
try:
|
||||
conn = httplib.HTTPSConnection("api.pushover.net:443")
|
||||
conn.request("POST", "/1/messages.json", urllib.urlencode({
|
||||
"token": apikey,
|
||||
"user": userkey,
|
||||
"device": device,
|
||||
"title": title,
|
||||
"message": msg,
|
||||
"priority": prio
|
||||
}), {"Content-type": "application/x-www-form-urlencoded"})
|
||||
res = conn.getresponse()
|
||||
if res.status != 200:
|
||||
logging.error(T('Bad response from Pushover (%s): %s'), res.status, res.read())
|
||||
|
||||
def do_send_pushover(body):
|
||||
try:
|
||||
conn = httplib.HTTPSConnection("api.pushover.net:443")
|
||||
conn.request("POST", "/1/messages.json", urllib.urlencode(body),
|
||||
{"Content-type": "application/x-www-form-urlencoded"})
|
||||
res = conn.getresponse()
|
||||
if res.status != 200:
|
||||
logging.error(T('Bad response from Pushover (%s): %s'), res.status, res.read())
|
||||
except:
|
||||
logging.warning(T('Failed to send pushover message'))
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
return T('Failed to send pushover message')
|
||||
else:
|
||||
return ''
|
||||
except:
|
||||
logging.warning(T('Failed to send pushover message'))
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
return T('Failed to send pushover message')
|
||||
return ''
|
||||
|
||||
|
||||
def send_pushbullet(title, msg, gtype, force=False, test=None):
|
||||
""" Send message to Pushbullet """
|
||||
|
||||
@@ -26,11 +26,11 @@ import datetime
|
||||
|
||||
import sabnzbd
|
||||
from sabnzbd.nzbstuff import NzbObject
|
||||
from sabnzbd.misc import exit_sab, cat_to_opts, remove_file, \
|
||||
get_admin_path, remove_all, globber_full, int_conv, caller_name
|
||||
from sabnzbd.misc import exit_sab, cat_to_opts, \
|
||||
get_admin_path, remove_all, globber_full, int_conv
|
||||
from sabnzbd.panic import panic_queue
|
||||
import sabnzbd.database as database
|
||||
from sabnzbd.decorators import NzbQueueLocker
|
||||
from sabnzbd.decorators import notify_downloader
|
||||
from sabnzbd.constants import QUEUE_FILE_NAME, QUEUE_VERSION, FUTURE_Q_FOLDER, \
|
||||
JOB_ADMIN, LOW_PRIORITY, NORMAL_PRIORITY, HIGH_PRIORITY, TOP_PRIORITY, \
|
||||
REPAIR_PRIORITY, STOP_PRIORITY, VERIFIED_FILE, \
|
||||
@@ -43,7 +43,6 @@ from sabnzbd.assembler import Assembler, file_has_articles
|
||||
import sabnzbd.notifier as notifier
|
||||
from sabnzbd.encoding import platform_encode
|
||||
from sabnzbd.bpsmeter import BPSMeter
|
||||
from sabnzbd.dirscanner import ProcessSingleFile
|
||||
|
||||
|
||||
class NzbQueue(object):
|
||||
@@ -100,7 +99,7 @@ class NzbQueue(object):
|
||||
self.add(nzo, save=True)
|
||||
else:
|
||||
try:
|
||||
remove_file(item)
|
||||
os.remove(item)
|
||||
except:
|
||||
pass
|
||||
|
||||
@@ -140,7 +139,7 @@ class NzbQueue(object):
|
||||
|
||||
# Remove any future-jobs, we can't save those
|
||||
for item in globber_full(os.path.join(cfg.admin_dir.get_path(), FUTURE_Q_FOLDER)):
|
||||
remove_file(item)
|
||||
os.remove(item)
|
||||
|
||||
# Done converting
|
||||
cfg.converted_nzo_pickles.set(True)
|
||||
@@ -148,7 +147,6 @@ class NzbQueue(object):
|
||||
nzo_ids = []
|
||||
return nzo_ids
|
||||
|
||||
@NzbQueueLocker
|
||||
def scan_jobs(self, all=False, action=True):
|
||||
""" Scan "incomplete" for missing folders,
|
||||
'all' is True: Include active folders
|
||||
@@ -232,6 +230,7 @@ class NzbQueue(object):
|
||||
|
||||
return nzo_id
|
||||
|
||||
@notify_downloader
|
||||
def send_back(self, nzo):
|
||||
""" Send back job to queue after successful pre-check """
|
||||
try:
|
||||
@@ -239,14 +238,13 @@ class NzbQueue(object):
|
||||
except:
|
||||
logging.debug('Failed to find NZB file after pre-check (%s)', nzo.nzo_id)
|
||||
return
|
||||
|
||||
from sabnzbd.dirscanner import ProcessSingleFile
|
||||
res, nzo_ids = ProcessSingleFile(nzo.work_name + '.nzb', nzb_path, keep=True, reuse=True)
|
||||
if res == 0 and nzo_ids:
|
||||
nzo = self.replace_in_q(nzo, nzo_ids[0])
|
||||
# Reset reuse flag to make pause/abort on encryption possible
|
||||
nzo.reuse = False
|
||||
|
||||
@NzbQueueLocker
|
||||
def replace_in_q(self, nzo, nzo_id):
|
||||
""" Replace nzo by new in at the same spot in the queue, destroy nzo """
|
||||
# Must be a separate function from "send_back()", due to the required queue-lock
|
||||
@@ -271,7 +269,6 @@ class NzbQueue(object):
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
return nzo
|
||||
|
||||
@NzbQueueLocker
|
||||
def save(self, save_nzo=None):
|
||||
""" Save queue, all nzo's or just the specified one """
|
||||
logging.info("Saving queue")
|
||||
@@ -342,8 +339,7 @@ class NzbQueue(object):
|
||||
nzo.set_final_name_pw(name, password)
|
||||
else:
|
||||
# Reset url fetch wait time
|
||||
nzo.url_wait = None
|
||||
nzo.url_tries = 0
|
||||
nzo.wait = None
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
@@ -354,7 +350,7 @@ class NzbQueue(object):
|
||||
else:
|
||||
return None
|
||||
|
||||
@NzbQueueLocker
|
||||
@notify_downloader
|
||||
def add(self, nzo, save=True, quiet=False):
|
||||
if not nzo.nzo_id:
|
||||
nzo.nzo_id = sabnzbd.get_new_id('nzo', nzo.workpath, self.__nzo_table)
|
||||
@@ -410,7 +406,6 @@ class NzbQueue(object):
|
||||
self.sort_by_avg_age()
|
||||
return nzo.nzo_id
|
||||
|
||||
@NzbQueueLocker
|
||||
def remove(self, nzo_id, add_to_history=True, save=True, cleanup=True, keep_basic=False, del_files=False):
|
||||
if nzo_id in self.__nzo_table:
|
||||
nzo = self.__nzo_table.pop(nzo_id)
|
||||
@@ -432,7 +427,7 @@ class NzbQueue(object):
|
||||
self.cleanup_nzo(nzo, keep_basic, del_files)
|
||||
|
||||
sabnzbd.remove_data(nzo_id, nzo.workpath)
|
||||
logging.info('[%s] Removed job %s', caller_name(), nzo.final_name)
|
||||
logging.info('Removed job %s', nzo.final_name)
|
||||
if save:
|
||||
self.save(nzo)
|
||||
else:
|
||||
@@ -454,7 +449,6 @@ class NzbQueue(object):
|
||||
|
||||
return removed
|
||||
|
||||
@NzbQueueLocker
|
||||
def remove_all(self, search=None):
|
||||
if search:
|
||||
search = search.lower()
|
||||
@@ -517,7 +511,7 @@ class NzbQueue(object):
|
||||
handled.append(nzo_id)
|
||||
return handled
|
||||
|
||||
@NzbQueueLocker
|
||||
@notify_downloader
|
||||
def resume_nzo(self, nzo_id):
|
||||
handled = []
|
||||
if nzo_id in self.__nzo_table:
|
||||
@@ -528,7 +522,6 @@ class NzbQueue(object):
|
||||
handled.append(nzo_id)
|
||||
return handled
|
||||
|
||||
@NzbQueueLocker
|
||||
def switch(self, item_id_1, item_id_2):
|
||||
try:
|
||||
# Allow an index as second parameter, easier for some skins
|
||||
@@ -577,39 +570,32 @@ class NzbQueue(object):
|
||||
# If moving failed/no movement took place
|
||||
return (-1, nzo1.priority)
|
||||
|
||||
@NzbQueueLocker
|
||||
def move_up_bulk(self, nzo_id, nzf_ids, size):
|
||||
if nzo_id in self.__nzo_table:
|
||||
for unused in range(size):
|
||||
self.__nzo_table[nzo_id].move_up_bulk(nzf_ids)
|
||||
|
||||
@NzbQueueLocker
|
||||
def move_top_bulk(self, nzo_id, nzf_ids):
|
||||
if nzo_id in self.__nzo_table:
|
||||
self.__nzo_table[nzo_id].move_top_bulk(nzf_ids)
|
||||
|
||||
@NzbQueueLocker
|
||||
def move_down_bulk(self, nzo_id, nzf_ids, size):
|
||||
if nzo_id in self.__nzo_table:
|
||||
for unused in range(size):
|
||||
self.__nzo_table[nzo_id].move_down_bulk(nzf_ids)
|
||||
|
||||
@NzbQueueLocker
|
||||
def move_bottom_bulk(self, nzo_id, nzf_ids):
|
||||
if nzo_id in self.__nzo_table:
|
||||
self.__nzo_table[nzo_id].move_bottom_bulk(nzf_ids)
|
||||
|
||||
@NzbQueueLocker
|
||||
def sort_by_avg_age(self, reverse=False):
|
||||
logging.info("Sorting by average date... (reversed:%s)", reverse)
|
||||
self.__nzo_list = sort_queue_function(self.__nzo_list, _nzo_date_cmp, reverse)
|
||||
|
||||
@NzbQueueLocker
|
||||
def sort_by_name(self, reverse=False):
|
||||
logging.info("Sorting by name... (reversed:%s)", reverse)
|
||||
self.__nzo_list = sort_queue_function(self.__nzo_list, _nzo_name_cmp, reverse)
|
||||
|
||||
@NzbQueueLocker
|
||||
def sort_by_size(self, reverse=False):
|
||||
logging.info("Sorting by size... (reversed:%s)", reverse)
|
||||
self.__nzo_list = sort_queue_function(self.__nzo_list, _nzo_size_cmp, reverse)
|
||||
@@ -631,7 +617,6 @@ class NzbQueue(object):
|
||||
else:
|
||||
logging.debug("Sort: %s not recognized", field)
|
||||
|
||||
@NzbQueueLocker
|
||||
def __set_priority(self, nzo_id, priority):
|
||||
""" Sets the priority on the nzo and places it in the queue at the appropriate position """
|
||||
try:
|
||||
@@ -704,7 +689,7 @@ class NzbQueue(object):
|
||||
except:
|
||||
return -1
|
||||
|
||||
@NzbQueueLocker
|
||||
@notify_downloader
|
||||
def set_priority(self, nzo_ids, priority):
|
||||
try:
|
||||
n = -1
|
||||
@@ -714,13 +699,11 @@ class NzbQueue(object):
|
||||
except:
|
||||
return -1
|
||||
|
||||
def reset_try_lists(self, article, article_reset=True):
|
||||
""" Let article get new fetcher and reset trylists """
|
||||
article.fetcher = None
|
||||
if article_reset:
|
||||
article.reset_try_list()
|
||||
article.nzf.reset_try_list()
|
||||
article.nzf.nzo.reset_try_list()
|
||||
def reset_try_lists(self, nzf=None, nzo=None):
|
||||
if nzf:
|
||||
nzf.reset_try_list()
|
||||
if nzo:
|
||||
nzo.reset_try_list()
|
||||
|
||||
def reset_all_try_lists(self):
|
||||
for nzo in self.__nzo_list:
|
||||
@@ -736,9 +719,6 @@ class NzbQueue(object):
|
||||
return False
|
||||
|
||||
def get_article(self, server, servers):
|
||||
""" Get next article for jobs in the queue
|
||||
Not locked for performance, since it only reads the queue
|
||||
"""
|
||||
for nzo in self.__nzo_list:
|
||||
# Not when queue paused and not a forced item
|
||||
if nzo.status not in (Status.PAUSED, Status.GRABBING) or nzo.priority == TOP_PRIORITY:
|
||||
@@ -753,9 +733,6 @@ class NzbQueue(object):
|
||||
return
|
||||
|
||||
def register_article(self, article, found=True):
|
||||
""" Register the articles we tried
|
||||
Not locked for performance, since it only modifies individual NZOs
|
||||
"""
|
||||
nzf = article.nzf
|
||||
nzo = nzf.nzo
|
||||
|
||||
@@ -796,7 +773,7 @@ class NzbQueue(object):
|
||||
|
||||
def end_job(self, nzo):
|
||||
""" Send NZO to the post-processing queue """
|
||||
logging.info('[%s] Ending job %s', caller_name(), nzo.final_name)
|
||||
logging.info('Ending job %s', nzo.final_name)
|
||||
|
||||
# Notify assembler to call postprocessor
|
||||
if not nzo.deleted:
|
||||
@@ -816,9 +793,7 @@ class NzbQueue(object):
|
||||
Assembler.do.process((nzo, None))
|
||||
|
||||
def actives(self, grabs=True):
|
||||
""" Return amount of non-paused jobs, optionally with 'grabbing' items
|
||||
Not locked for performance, only reads the queue
|
||||
"""
|
||||
""" Return amount of non-paused jobs, optionally with 'grabbing' items """
|
||||
n = 0
|
||||
for nzo in self.__nzo_list:
|
||||
# Ignore any items that are paused
|
||||
@@ -831,7 +806,6 @@ class NzbQueue(object):
|
||||
def queue_info(self, search=None, start=0, limit=0):
|
||||
""" Return list of queued jobs,
|
||||
optionally filtered by 'search' and limited by start and limit.
|
||||
Not locked for performance, only reads the queue
|
||||
"""
|
||||
if search:
|
||||
search = search.lower()
|
||||
@@ -862,9 +836,7 @@ class NzbQueue(object):
|
||||
return QNFO(bytes_total, bytes_left, bytes_left_previous_page, pnfo_list, q_size, n)
|
||||
|
||||
def remaining(self):
|
||||
""" Return bytes left in the queue by non-paused items
|
||||
Not locked for performance, only reads the queue
|
||||
"""
|
||||
""" Return bytes left in the queue by non-paused items """
|
||||
bytes_left = 0
|
||||
for nzo in self.__nzo_list:
|
||||
if nzo.status != 'Paused':
|
||||
@@ -890,7 +862,6 @@ class NzbQueue(object):
|
||||
empty = []
|
||||
for nzo in self.__nzo_list:
|
||||
if not nzo.futuretype and not nzo.files and nzo.status not in (Status.PAUSED, Status.GRABBING):
|
||||
logging.info('Found idle job %s', nzo.final_name)
|
||||
empty.append(nzo)
|
||||
|
||||
# Stall prevention by checking if all servers are in the trylist
|
||||
@@ -900,11 +871,8 @@ class NzbQueue(object):
|
||||
for nzf in nzo.files:
|
||||
if len(nzf.try_list) == sabnzbd.downloader.Downloader.do.server_nr:
|
||||
# We do not want to reset all article trylists, they are good
|
||||
logging.info('Resetting bad trylist for file %s in job %s', nzf.filename, nzo.final_name)
|
||||
nzf.reset_try_list()
|
||||
|
||||
# Reset main trylist, minimal performance impact
|
||||
logging.info('Resetting bad trylist for job %s', nzo.final_name)
|
||||
nzo.reset_try_list()
|
||||
|
||||
for nzo in empty:
|
||||
@@ -915,7 +883,7 @@ class NzbQueue(object):
|
||||
if nzo.priority == priority:
|
||||
nzo.pause()
|
||||
|
||||
@NzbQueueLocker
|
||||
@notify_downloader
|
||||
def resume_on_prio(self, priority):
|
||||
for nzo in self.__nzo_list:
|
||||
if nzo.priority == priority:
|
||||
@@ -927,7 +895,7 @@ class NzbQueue(object):
|
||||
if nzo.cat == cat:
|
||||
nzo.pause()
|
||||
|
||||
@NzbQueueLocker
|
||||
@notify_downloader
|
||||
def resume_on_cat(self, cat):
|
||||
for nzo in self.__nzo_list:
|
||||
if nzo.cat == cat:
|
||||
|
||||
@@ -47,7 +47,7 @@ from sabnzbd.misc import to_units, cat_to_opts, cat_convert, sanitize_foldername
|
||||
get_unique_path, get_admin_path, remove_all, sanitize_filename, globber_full, \
|
||||
int_conv, set_permissions, format_time_string, long_path, trim_win_path, \
|
||||
fix_unix_encoding, calc_age, is_obfuscated_filename, get_ext, get_filename, \
|
||||
get_unique_filename, renamer, remove_file, remove_dir
|
||||
get_unique_filename, renamer
|
||||
from sabnzbd.decorators import synchronized
|
||||
import sabnzbd.config as config
|
||||
import sabnzbd.cfg as cfg
|
||||
@@ -112,7 +112,7 @@ class TryList(object):
|
||||
# Article
|
||||
##############################################################################
|
||||
ArticleSaver = (
|
||||
'article', 'art_id', 'bytes', 'partnum', 'lowest_partnum', 'nzf'
|
||||
'article', 'art_id', 'bytes', 'partnum', 'nzf'
|
||||
)
|
||||
|
||||
|
||||
@@ -128,7 +128,6 @@ class Article(TryList):
|
||||
self.art_id = None
|
||||
self.bytes = bytes
|
||||
self.partnum = partnum
|
||||
self.lowest_partnum = False
|
||||
self.tries = 0 # Try count
|
||||
self.nzf = nzf
|
||||
|
||||
@@ -270,23 +269,7 @@ class NzbFile(TryList):
|
||||
self.valid = bool(article_db)
|
||||
|
||||
if self.valid and self.nzf_id:
|
||||
# Save first article seperate, but not for all but first par2 file
|
||||
# Non-par2 files and the first par2 will have no volume and block number
|
||||
# When DirectUnpack is disabled, do not do any of this to also preserve disk IO
|
||||
setname, vol, block = sabnzbd.par2file.analyse_par2(self.filename)
|
||||
if cfg.direct_unpack() and not vol and not block:
|
||||
first_num = min(article_db.keys())
|
||||
first_article = self.add_article(article_db.pop(first_num), first_num)
|
||||
first_article.lowest_partnum = True
|
||||
self.nzo.first_articles.append(first_article)
|
||||
|
||||
# Any articles left?
|
||||
if article_db:
|
||||
# Save the rest
|
||||
sabnzbd.save_data(article_db, self.nzf_id, nzo.workpath)
|
||||
else:
|
||||
# All imported
|
||||
self.import_finished = True
|
||||
sabnzbd.save_data(article_db, self.nzf_id, nzo.workpath)
|
||||
|
||||
def finish_import(self):
|
||||
""" Load the article objects from disk """
|
||||
@@ -294,28 +277,22 @@ class NzbFile(TryList):
|
||||
article_db = sabnzbd.load_data(self.nzf_id, self.nzo.workpath, remove=False)
|
||||
if article_db:
|
||||
for partnum in article_db:
|
||||
self.add_article(article_db[partnum], partnum)
|
||||
art_id = article_db[partnum][0]
|
||||
bytes = article_db[partnum][1]
|
||||
|
||||
# Make sure we have labeled the lowest part number
|
||||
# Also when DirectUnpack is disabled we need to know
|
||||
self.decodetable[min(self.decodetable)].lowest_partnum = True
|
||||
article = Article(art_id, bytes, partnum, self)
|
||||
|
||||
self.articles.append(article)
|
||||
self.decodetable[partnum] = article
|
||||
|
||||
# Mark safe to continue
|
||||
self.import_finished = True
|
||||
elif not self.nzo.is_gone():
|
||||
# TEMPORARY ERRORS
|
||||
if not os.path.exists(os.path.join(self.nzf_id, self.nzo.workpath)):
|
||||
logging.warning('Article DB file not found %s: %s', self.nzf_id, self)
|
||||
logging.warning('Article DB file not found %s', self)
|
||||
else:
|
||||
# It was there, but empty
|
||||
logging.warning('Article DB empty %s: %s', self.nzf_id, self)
|
||||
|
||||
def add_article(self, article_info, partnum):
|
||||
""" Add article to object database and return article object """
|
||||
article = Article(article_info[0], article_info[1], partnum, self)
|
||||
self.articles.append(article)
|
||||
self.decodetable[partnum] = article
|
||||
return article
|
||||
logging.warning('Article DB empty %s', self)
|
||||
|
||||
def remove_article(self, article, found):
|
||||
""" Handle completed article, possibly end of file """
|
||||
@@ -352,11 +329,15 @@ class NzbFile(TryList):
|
||||
""" Is this file completed? """
|
||||
return self.import_finished and not bool(self.articles)
|
||||
|
||||
@property
|
||||
def lowest_partnum(self):
|
||||
""" Get lowest article number of this file """
|
||||
return min(self.decodetable)
|
||||
|
||||
def remove_admin(self):
|
||||
""" Remove article database from disk (sabnzbd_nzf_<id>)"""
|
||||
try:
|
||||
logging.debug('Removing article database for %s', self.nzf_id)
|
||||
remove_file(os.path.join(self.nzo.workpath, self.nzf_id))
|
||||
os.remove(os.path.join(self.nzo.workpath, self.nzf_id))
|
||||
except:
|
||||
pass
|
||||
|
||||
@@ -530,7 +511,7 @@ class NzbParser(xml.sax.handler.ContentHandler):
|
||||
self.nzf_list.remove(nzo_matches[0])
|
||||
|
||||
if nzf.valid and nzf.nzf_id:
|
||||
logging.info('File %s - %s added to queue', nzf.filename, nzf.nzf_id)
|
||||
logging.info('File %s added to queue', self.filename)
|
||||
self.nzo.files.append(nzf)
|
||||
self.nzo.files_table[nzf.nzf_id] = nzf
|
||||
self.nzo.bytes += nzf.bytes
|
||||
@@ -580,7 +561,7 @@ NzbObjectSaver = (
|
||||
'status', 'avg_bps_freq', 'avg_bps_total', 'priority', 'saved_articles', 'nzo_id',
|
||||
'futuretype', 'deleted', 'parsed', 'action_line', 'unpack_info', 'fail_msg', 'nzo_info',
|
||||
'custom_name', 'password', 'next_save', 'save_timeout', 'encrypted', 'bad_articles',
|
||||
'duplicate', 'oversized', 'precheck', 'incomplete', 'reuse', 'meta', 'first_articles',
|
||||
'duplicate', 'oversized', 'precheck', 'incomplete', 'reuse', 'meta',
|
||||
'md5sum', 'servercount', 'unwanted_ext', 'renames', 'rating_filtered'
|
||||
)
|
||||
|
||||
@@ -590,6 +571,7 @@ NZO_LOCK = threading.RLock()
|
||||
|
||||
class NzbObject(TryList):
|
||||
|
||||
@synchronized(NZO_LOCK)
|
||||
def __init__(self, filename, pp, script, nzb=None,
|
||||
futuretype=False, cat=None, url=None,
|
||||
priority=NORMAL_PRIORITY, nzbname=None, status="Queued", nzo_info=None,
|
||||
@@ -624,9 +606,8 @@ class NzbObject(TryList):
|
||||
# In case only /password was entered for nzbname
|
||||
work_name = filename
|
||||
|
||||
# Remove trailing .nzb and .par(2)
|
||||
self.work_name = create_work_name(work_name)
|
||||
self.final_name = create_work_name(work_name)
|
||||
self.work_name = work_name
|
||||
self.final_name = work_name
|
||||
|
||||
self.meta = {}
|
||||
self.servercount = {} # Dict to keep bytes per server
|
||||
@@ -637,7 +618,7 @@ class NzbObject(TryList):
|
||||
self.bytes_tried = 0 # Which bytes did we try
|
||||
self.bytes_missing = 0 # Bytes missing
|
||||
self.bad_articles = 0 # How many bad (non-recoverable) articles
|
||||
self.set_priority(priority) # Parse priority of input
|
||||
self.set_priority(priority) # Parse priority
|
||||
self.repair = r # True if we want to repair this set
|
||||
self.unpack = u # True if we want to unpack this set
|
||||
self.delete = d # True if we want to delete this set
|
||||
@@ -668,7 +649,6 @@ class NzbObject(TryList):
|
||||
self.avg_bps_freq = 0
|
||||
self.avg_bps_total = 0
|
||||
|
||||
self.first_articles = []
|
||||
self.saved_articles = []
|
||||
|
||||
self.nzo_id = None
|
||||
@@ -708,11 +688,13 @@ class NzbObject(TryList):
|
||||
self.next_save = None
|
||||
self.save_timeout = None
|
||||
self.encrypted = 0
|
||||
self.url_wait = None
|
||||
self.url_tries = 0
|
||||
self.wait = None
|
||||
self.pp_active = False # Signals active post-processing (not saved)
|
||||
self.md5sum = None
|
||||
|
||||
# Remove trailing .nzb and .par(2)
|
||||
self.work_name = create_work_name(self.work_name)
|
||||
|
||||
if nzb is None:
|
||||
# This is a slot for a future NZB, ready now
|
||||
return
|
||||
@@ -825,40 +807,27 @@ class NzbObject(TryList):
|
||||
self.repair, self.unpack, self.delete = sabnzbd.pp_to_opts(pp_tmp)
|
||||
|
||||
# Run user pre-queue script if needed
|
||||
if not reuse and cfg.pre_script():
|
||||
accept, name, pp, cat_pp, script_pp, priority, group = \
|
||||
if not reuse:
|
||||
accept, name, pp, cat, script, priority, group = \
|
||||
sabnzbd.newsunpack.pre_queue(self.final_name_pw_clean, pp, cat, script,
|
||||
priority, self.bytes, self.groups)
|
||||
# Accept or reject
|
||||
accept = int_conv(accept)
|
||||
if accept < 1:
|
||||
self.purge_data()
|
||||
raise TypeError
|
||||
if accept == 2:
|
||||
self.fail_msg = T('Pre-queue script marked job as failed')
|
||||
|
||||
# Process all options, only over-write if set by script
|
||||
# Beware that cannot do "if priority/pp", because those can
|
||||
# also have a valid value of 0, which shouldn't be ignored
|
||||
if name:
|
||||
self.set_final_name_pw(name)
|
||||
try:
|
||||
pp = int(pp)
|
||||
except:
|
||||
pp = None
|
||||
if cat_pp:
|
||||
cat = cat_pp
|
||||
try:
|
||||
priority = int(priority)
|
||||
except:
|
||||
priority = DEFAULT_PRIORITY
|
||||
if script_pp:
|
||||
script = script_pp
|
||||
if accept < 1:
|
||||
self.purge_data()
|
||||
raise TypeError
|
||||
if name:
|
||||
self.set_final_name_pw(name)
|
||||
if group:
|
||||
self.groups = [str(group)]
|
||||
if accept == 2:
|
||||
self.fail_msg = T('Pre-queue script marked job as failed')
|
||||
|
||||
# Re-evaluate results from pre-queue script
|
||||
self.cat, pp, self.script, priority = cat_to_opts(cat, pp, script, priority)
|
||||
self.cat, pp, self.script, priority = cat_to_opts(cat, pp, script, int_conv(priority))
|
||||
self.set_priority(priority)
|
||||
self.repair, self.unpack, self.delete = sabnzbd.pp_to_opts(pp)
|
||||
else:
|
||||
@@ -906,8 +875,37 @@ class NzbObject(TryList):
|
||||
if reuse:
|
||||
self.check_existing_files(wdir)
|
||||
|
||||
# Perform sorting
|
||||
self.sort_nzfs()
|
||||
if cfg.auto_sort():
|
||||
self.files.sort(cmp=nzf_cmp_date)
|
||||
else:
|
||||
self.files.sort(cmp=nzf_cmp_name)
|
||||
|
||||
# In the hunt for Unwanted Extensions:
|
||||
# The file with the unwanted extension often is in the first or the last rar file
|
||||
# So put the last rar immediately after the first rar file so that it gets detected early
|
||||
if cfg.unwanted_extensions() and not cfg.auto_sort():
|
||||
# ... only useful if there are unwanted extensions defined and there is no sorting on date
|
||||
logging.debug('Unwanted Extension: putting last rar after first rar')
|
||||
nzfposcounter = firstrarpos = lastrarpos = 0
|
||||
for nzf in self.files:
|
||||
nzfposcounter += 1
|
||||
if '.rar' in str(nzf):
|
||||
# a NZF found with '.rar' in the name
|
||||
if firstrarpos == 0:
|
||||
# this is the first .rar found, so remember this position
|
||||
firstrarpos = nzfposcounter
|
||||
lastrarpos = nzfposcounter
|
||||
lastrarnzf = nzf # The NZF itself
|
||||
|
||||
if firstrarpos != lastrarpos:
|
||||
# at least two different .rar's found
|
||||
logging.debug('Unwanted Extension: First rar at %s, Last rar at %s', firstrarpos, lastrarpos)
|
||||
logging.debug('Unwanted Extension: Last rar is %s', str(lastrarnzf))
|
||||
try:
|
||||
self.files.remove(lastrarnzf) # first remove. NB: remove() does searches for lastrarnzf
|
||||
self.files.insert(firstrarpos, lastrarnzf) # ... and only then add after position firstrarpos
|
||||
except:
|
||||
logging.debug('The lastrar swap did not go well')
|
||||
|
||||
# Copy meta fields to nzo_info, if not already set
|
||||
for kw in self.meta:
|
||||
@@ -951,42 +949,6 @@ class NzbObject(TryList):
|
||||
nzf.deleted = True
|
||||
return not bool(self.files)
|
||||
|
||||
def sort_nzfs(self):
|
||||
""" Sort the files in the NZO, respecting
|
||||
date sorting and unwanted extensions
|
||||
"""
|
||||
if cfg.auto_sort():
|
||||
self.files.sort(cmp=nzf_cmp_date)
|
||||
else:
|
||||
self.files.sort(cmp=nzf_cmp_name)
|
||||
|
||||
# In the hunt for Unwanted Extensions:
|
||||
# The file with the unwanted extension often is in the first or the last rar file
|
||||
# So put the last rar immediately after the first rar file so that it gets detected early
|
||||
if cfg.unwanted_extensions() and not cfg.auto_sort():
|
||||
# ... only useful if there are unwanted extensions defined and there is no sorting on date
|
||||
logging.debug('Unwanted Extension: putting last rar after first rar')
|
||||
nzfposcounter = firstrarpos = lastrarpos = 0
|
||||
for nzf in self.files:
|
||||
nzfposcounter += 1
|
||||
if '.rar' in str(nzf):
|
||||
# a NZF found with '.rar' in the name
|
||||
if firstrarpos == 0:
|
||||
# this is the first .rar found, so remember this position
|
||||
firstrarpos = nzfposcounter
|
||||
lastrarpos = nzfposcounter
|
||||
lastrarnzf = nzf # The NZF itself
|
||||
|
||||
if firstrarpos != lastrarpos:
|
||||
# at least two different .rar's found
|
||||
logging.debug('Unwanted Extension: First rar at %s, Last rar at %s', firstrarpos, lastrarpos)
|
||||
logging.debug('Unwanted Extension: Last rar is %s', str(lastrarnzf))
|
||||
try:
|
||||
self.files.remove(lastrarnzf) # first remove. NB: remove() does searches for lastrarnzf
|
||||
self.files.insert(firstrarpos, lastrarnzf) # ... and only then add after position firstrarpos
|
||||
except:
|
||||
logging.debug('The lastrar swap did not go well')
|
||||
|
||||
def reset_all_try_lists(self):
|
||||
for nzf in self.files:
|
||||
nzf.reset_all_try_lists()
|
||||
@@ -1023,9 +985,6 @@ class NzbObject(TryList):
|
||||
for setname in self.extrapars:
|
||||
self.extrapars[parset].sort(key=lambda x: x.blocks)
|
||||
|
||||
# Also re-parse all filenames in case par2 came after first articles
|
||||
self.verify_all_filenames_and_resort()
|
||||
|
||||
@synchronized(NZO_LOCK)
|
||||
def handle_par2(self, nzf, filepath):
|
||||
""" Check if file is a par2 and build up par2 collection """
|
||||
@@ -1138,23 +1097,8 @@ class NzbObject(TryList):
|
||||
@synchronized(NZO_LOCK)
|
||||
def remove_article(self, article, found):
|
||||
nzf = article.nzf
|
||||
|
||||
# First or regular article?
|
||||
if article.lowest_partnum and self.first_articles and article in self.first_articles:
|
||||
self.first_articles.remove(article)
|
||||
|
||||
# All first articles done?
|
||||
if not self.first_articles and self.md5of16k:
|
||||
self.verify_all_filenames_and_resort()
|
||||
|
||||
# Remove from file-tracking
|
||||
file_done = nzf.remove_article(article, found)
|
||||
|
||||
# Only on fully loaded files we can say if it's really done
|
||||
if not nzf.import_finished:
|
||||
file_done = False
|
||||
|
||||
# File completed, remove and do checks
|
||||
if file_done:
|
||||
self.remove_nzf(nzf)
|
||||
if not self.reuse and cfg.fail_hopeless_jobs() and not self.check_quality(99)[0]:
|
||||
@@ -1284,20 +1228,10 @@ class NzbObject(TryList):
|
||||
|
||||
def set_priority(self, value):
|
||||
""" Check if this is a valid priority """
|
||||
# When unknown (0 is a known one), set to DEFAULT
|
||||
if value == '' or value is None:
|
||||
self.priority = DEFAULT_PRIORITY
|
||||
return
|
||||
|
||||
# Convert input
|
||||
value = int_conv(value)
|
||||
if value in (REPAIR_PRIORITY, TOP_PRIORITY, HIGH_PRIORITY, NORMAL_PRIORITY, \
|
||||
LOW_PRIORITY, DEFAULT_PRIORITY, PAUSED_PRIORITY, DUP_PRIORITY, STOP_PRIORITY):
|
||||
self.priority = value
|
||||
return
|
||||
|
||||
# Invalid value, set to normal priority
|
||||
self.priority = NORMAL_PRIORITY
|
||||
|
||||
@property
|
||||
def final_name_labeled(self):
|
||||
@@ -1314,8 +1248,8 @@ class NzbObject(TryList):
|
||||
prefix += T('UNWANTED') + ' / ' # : Queue indicator for unwanted extensions
|
||||
if self.rating_filtered and self.status == 'Paused':
|
||||
prefix += T('FILTERED') + ' / ' # : Queue indicator for filtered
|
||||
if isinstance(self.url_wait, float):
|
||||
dif = int(self.url_wait - time.time() + 0.5)
|
||||
if isinstance(self.wait, float):
|
||||
dif = int(self.wait - time.time() + 0.5)
|
||||
if dif > 0:
|
||||
prefix += T('WAIT %s sec') % dif + ' / ' # : Queue indicator for waiting URL fetch
|
||||
if (self.avg_stamp + float(cfg.propagation_delay() * 60)) > time.time() and self.priority != TOP_PRIORITY:
|
||||
@@ -1472,7 +1406,7 @@ class NzbObject(TryList):
|
||||
# format the total time the download took, in days, hours, and minutes, or seconds.
|
||||
complete_time = format_time_string(seconds, timecompleted.days)
|
||||
|
||||
msg1 = T('Downloaded in %s at an average of %sB/s') % (complete_time, to_units(avg_bps * 1024))
|
||||
msg1 = T('Downloaded in %s at an average of %sB/s') % (complete_time, to_units(avg_bps * 1024, dec_limit=1))
|
||||
msg1 += u'<br/>' + T('Age') + ': ' + calc_age(self.avg_date, True)
|
||||
|
||||
bad = self.nzo_info.get('bad_articles', 0)
|
||||
@@ -1512,44 +1446,35 @@ class NzbObject(TryList):
|
||||
article = None
|
||||
nzf_remove_list = []
|
||||
|
||||
# Did we go through all first-articles?
|
||||
if self.first_articles:
|
||||
for article_test in self.first_articles:
|
||||
article = article_test.get_article(server, servers)
|
||||
if article:
|
||||
break
|
||||
|
||||
# Move on to next ones
|
||||
if not article:
|
||||
for nzf in self.files:
|
||||
if nzf.deleted:
|
||||
logging.debug('Skipping existing file %s', nzf.filename or nzf.subject)
|
||||
else:
|
||||
# Don't try to get an article if server is in try_list of nzf
|
||||
if not nzf.server_in_try_list(server):
|
||||
if not nzf.import_finished:
|
||||
# Only load NZF when it's a primary server
|
||||
# or when it's a backup server without active primaries
|
||||
if sabnzbd.highest_server(server):
|
||||
nzf.finish_import()
|
||||
# Still not finished? Something went wrong...
|
||||
if not nzf.import_finished and not self.is_gone():
|
||||
logging.error(T('Error importing %s'), nzf)
|
||||
nzf_remove_list.append(nzf)
|
||||
nzf.nzo.status = Status.PAUSED
|
||||
continue
|
||||
else:
|
||||
for nzf in self.files:
|
||||
if nzf.deleted:
|
||||
logging.debug('Skipping existing file %s', nzf.filename or nzf.subject)
|
||||
else:
|
||||
# Don't try to get an article if server is in try_list of nzf
|
||||
if not nzf.server_in_try_list(server):
|
||||
if not nzf.import_finished:
|
||||
# Only load NZF when it's a primary server
|
||||
# or when it's a backup server without active primaries
|
||||
if sabnzbd.highest_server(server):
|
||||
nzf.finish_import()
|
||||
# Still not finished? Something went wrong...
|
||||
if not nzf.import_finished and not self.is_gone():
|
||||
logging.error(T('Error importing %s'), nzf)
|
||||
nzf_remove_list.append(nzf)
|
||||
nzf.nzo.pause()
|
||||
continue
|
||||
else:
|
||||
continue
|
||||
|
||||
article = nzf.get_article(server, servers)
|
||||
if article:
|
||||
break
|
||||
article = nzf.get_article(server, servers)
|
||||
if article:
|
||||
break
|
||||
|
||||
# Remove all files for which admin could not be read
|
||||
for nzf in nzf_remove_list:
|
||||
nzf.deleted = True
|
||||
nzf.completed = True
|
||||
self.files.remove(nzf)
|
||||
|
||||
# If cleanup emptied the active files list, end this job
|
||||
if nzf_remove_list and not self.files:
|
||||
sabnzbd.NzbQueue.do.end_job(self)
|
||||
@@ -1654,14 +1579,6 @@ class NzbObject(TryList):
|
||||
self.renamed_file(yenc_filename, nzf.filename)
|
||||
nzf.filename = yenc_filename
|
||||
|
||||
def verify_all_filenames_and_resort(self):
|
||||
""" Verify all filenames based on par2 info and then re-sort files """
|
||||
logging.info('Checking all filenames for %s', self.final_name)
|
||||
for nzf_verify in self.files:
|
||||
self.verify_nzf_filename(nzf_verify)
|
||||
logging.info('Re-sorting %s after getting filename information', self.final_name)
|
||||
self.sort_nzfs()
|
||||
|
||||
@synchronized(NZO_LOCK)
|
||||
def renamed_file(self, name_set, old_name=None):
|
||||
""" Save renames at various stages (Download/PP)
|
||||
@@ -1738,14 +1655,14 @@ class NzbObject(TryList):
|
||||
remove_all(wpath, 'SABnzbd_nz?_*', keep_folder=True)
|
||||
remove_all(wpath, 'SABnzbd_article_*', keep_folder=True)
|
||||
# We save the renames file
|
||||
sabnzbd.save_data(self.renames, RENAMES_FILE, self.workpath, silent=True)
|
||||
sabnzbd.save_data(self.renames, RENAMES_FILE, self.workpath)
|
||||
else:
|
||||
remove_all(wpath, recursive=True)
|
||||
if del_files:
|
||||
remove_all(self.downpath, recursive=True)
|
||||
else:
|
||||
try:
|
||||
remove_dir(self.downpath)
|
||||
os.rmdir(self.downpath)
|
||||
except:
|
||||
pass
|
||||
|
||||
@@ -1887,8 +1804,7 @@ class NzbObject(TryList):
|
||||
# Set non-transferable values
|
||||
self.pp_active = False
|
||||
self.avg_stamp = time.mktime(self.avg_date.timetuple())
|
||||
self.url_wait = None
|
||||
self.url_tries = 0
|
||||
self.wait = None
|
||||
self.to_be_removed = False
|
||||
self.direct_unpacker = None
|
||||
if self.meta is None:
|
||||
|
||||
@@ -461,7 +461,7 @@ class SABnzbdDelegate(NSObject):
|
||||
self.setMenuTitle_("")
|
||||
elif bytes_left > 0:
|
||||
self.state = ""
|
||||
speed = to_units(bpsnow)
|
||||
speed = to_units(bpsnow, dec_limit=1)
|
||||
# "10.1 MB/s" doesn't fit, remove space char
|
||||
if 'M' in speed and len(speed) > 5:
|
||||
speed = speed.replace(' ', '')
|
||||
|
||||
@@ -22,7 +22,6 @@ sabnzbd.panic - Send panic message to the browser
|
||||
import os
|
||||
import logging
|
||||
import tempfile
|
||||
import ctypes
|
||||
try:
|
||||
import webbrowser
|
||||
except ImportError:
|
||||
@@ -30,7 +29,6 @@ except ImportError:
|
||||
|
||||
import sabnzbd
|
||||
import sabnzbd.cfg as cfg
|
||||
from sabnzbd.encoding import unicoder
|
||||
|
||||
PANIC_PORT = 1
|
||||
PANIC_TEMPL = 2
|
||||
@@ -166,7 +164,7 @@ def panic_message(panic, a=None, b=None):
|
||||
|
||||
|
||||
def panic_port(host, port):
|
||||
show_error_dialog("\n%s:\n %s" % (T('Fatal error'), T('Unable to bind to port %s on %s. Some other software uses the port or SABnzbd is already running.') % (port, host)))
|
||||
print "\n%s:\n %s" % (T('Fatal error'), T('Unable to bind to port %s on %s. Some other software uses the port or SABnzbd is already running.') % (port, host))
|
||||
launch_a_browser(panic_message(PANIC_PORT, host, port))
|
||||
|
||||
|
||||
@@ -187,7 +185,7 @@ def panic_sqlite(name):
|
||||
|
||||
|
||||
def panic(reason, remedy=""):
|
||||
show_error_dialog("\n%s:\n %s\n%s" % (T('Fatal error'), reason, remedy))
|
||||
print "\n%s:\n %s\n%s" % (T('Fatal error'), reason, remedy)
|
||||
launch_a_browser(panic_message(PANIC_OTHER, reason, remedy))
|
||||
|
||||
|
||||
@@ -219,15 +217,6 @@ def launch_a_browser(url, force=False):
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
|
||||
|
||||
def show_error_dialog(msg):
|
||||
""" Show a pop-up when program cannot start
|
||||
Windows-only, otherwise only print to console
|
||||
"""
|
||||
if sabnzbd.WIN32:
|
||||
ctypes.windll.user32.MessageBoxW(0, unicoder(msg), T('Fatal error'), 0)
|
||||
print msg
|
||||
|
||||
|
||||
def error_page_401(status, message, traceback, version):
|
||||
""" Custom handler for 401 error """
|
||||
title = T('Access denied')
|
||||
|
||||
@@ -24,6 +24,7 @@ import Queue
|
||||
import logging
|
||||
import sabnzbd
|
||||
import xml.sax.saxutils
|
||||
import xml.etree.ElementTree
|
||||
import time
|
||||
import re
|
||||
|
||||
@@ -34,7 +35,7 @@ from sabnzbd.misc import real_path, get_unique_path, create_dirs, move_to_path,
|
||||
make_script_path, long_path, clip_path, \
|
||||
on_cleanup_list, renamer, remove_dir, remove_all, globber, globber_full, \
|
||||
set_permissions, cleanup_empty_directories, fix_unix_encoding, \
|
||||
sanitize_and_trim_path, sanitize_files_in_folder, remove_file
|
||||
sanitize_and_trim_path, sanitize_files_in_folder
|
||||
from sabnzbd.tvsort import Sorter
|
||||
from sabnzbd.constants import REPAIR_PRIORITY, TOP_PRIORITY, POSTPROC_QUEUE_FILE_NAME, \
|
||||
POSTPROC_QUEUE_VERSION, sample_match, JOB_ADMIN, Status, VERIFIED_FILE
|
||||
@@ -51,8 +52,6 @@ import sabnzbd.notifier as notifier
|
||||
import sabnzbd.utils.rarfile as rarfile
|
||||
import sabnzbd.utils.checkdir
|
||||
|
||||
MAX_FAST_JOB_COUNT = 3
|
||||
|
||||
# Match samples
|
||||
RE_SAMPLE = re.compile(sample_match, re.I)
|
||||
|
||||
@@ -69,26 +68,15 @@ class PostProcessor(Thread):
|
||||
|
||||
if self.history_queue is None:
|
||||
self.history_queue = []
|
||||
|
||||
# Fast-queue for jobs already finished by DirectUnpack
|
||||
self.fast_queue = Queue.Queue()
|
||||
|
||||
# Regular queue for jobs that might need more attention
|
||||
self.slow_queue = Queue.Queue()
|
||||
|
||||
# Load all old jobs
|
||||
self.queue = Queue.Queue()
|
||||
for nzo in self.history_queue:
|
||||
self.process(nzo)
|
||||
|
||||
# Counter to not only process fast-jobs
|
||||
self.__fast_job_count = 0
|
||||
|
||||
# State variables
|
||||
self.__stop = False
|
||||
self.__busy = False
|
||||
self.paused = False
|
||||
PostProcessor.do = self
|
||||
|
||||
self.__busy = False # True while a job is being processed
|
||||
|
||||
def save(self):
|
||||
""" Save postproc queue """
|
||||
logging.info("Saving postproc queue")
|
||||
@@ -128,12 +116,7 @@ class PostProcessor(Thread):
|
||||
""" Push on finished job in the queue """
|
||||
if nzo not in self.history_queue:
|
||||
self.history_queue.append(nzo)
|
||||
|
||||
# Fast-track if it has DirectUnpacked jobs or if it's still going
|
||||
if nzo.direct_unpacker and (nzo.direct_unpacker.success_sets or not nzo.direct_unpacker.killed):
|
||||
self.fast_queue.put(nzo)
|
||||
else:
|
||||
self.slow_queue.put(nzo)
|
||||
self.queue.put(nzo)
|
||||
self.save()
|
||||
sabnzbd.history_updated()
|
||||
|
||||
@@ -149,8 +132,7 @@ class PostProcessor(Thread):
|
||||
def stop(self):
|
||||
""" Stop thread after finishing running job """
|
||||
self.__stop = True
|
||||
self.slow_queue.put(None)
|
||||
self.fast_queue.put(None)
|
||||
self.queue.put(None)
|
||||
|
||||
def cancel_pp(self, nzo_id):
|
||||
""" Change the status, so that the PP is canceled """
|
||||
@@ -164,7 +146,7 @@ class PostProcessor(Thread):
|
||||
|
||||
def empty(self):
|
||||
""" Return True if pp queue is empty """
|
||||
return self.slow_queue.empty() and self.fast_queue.empty() and not self.__busy
|
||||
return self.queue.empty() and not self.__busy
|
||||
|
||||
def get_queue(self):
|
||||
""" Return list of NZOs that still need to be processed """
|
||||
@@ -186,18 +168,6 @@ class PostProcessor(Thread):
|
||||
else:
|
||||
logging.info("Completed Download Folder %s is not on FAT", complete_dir)
|
||||
|
||||
# Check on Windows if we have unicode-subprocess
|
||||
if sabnzbd.WIN32:
|
||||
try:
|
||||
import subprocessww
|
||||
except ImportError:
|
||||
logging.warning(T('Module subprocessww missing. Expect problems with Unicoded file and directory names in downloads.'))
|
||||
|
||||
# Do a pruge of the history-items if it was set, just to be sure
|
||||
history_db = database.HistoryDB()
|
||||
history_db.auto_history_purge()
|
||||
history_db.close()
|
||||
|
||||
# Start looping
|
||||
check_eoq = False
|
||||
while not self.__stop:
|
||||
@@ -207,28 +177,15 @@ class PostProcessor(Thread):
|
||||
time.sleep(5)
|
||||
continue
|
||||
|
||||
# Something in the fast queue?
|
||||
try:
|
||||
# Every few fast-jobs we should check allow a
|
||||
# slow job so that they don't wait forever
|
||||
if self.__fast_job_count >= MAX_FAST_JOB_COUNT and self.slow_queue.qsize():
|
||||
raise Queue.Empty
|
||||
|
||||
nzo = self.fast_queue.get(timeout=2)
|
||||
self.__fast_job_count += 1
|
||||
nzo = self.queue.get(timeout=1)
|
||||
except Queue.Empty:
|
||||
# Try the slow queue
|
||||
try:
|
||||
nzo = self.slow_queue.get(timeout=2)
|
||||
# Reset fast-counter
|
||||
self.__fast_job_count = 0
|
||||
except Queue.Empty:
|
||||
# Check for empty queue
|
||||
if check_eoq:
|
||||
check_eoq = False
|
||||
handle_empty_queue()
|
||||
# No fast or slow jobs, better luck next loop!
|
||||
if check_eoq:
|
||||
check_eoq = False
|
||||
handle_empty_queue()
|
||||
continue
|
||||
else:
|
||||
nzo = self.queue.get()
|
||||
|
||||
# Stop job
|
||||
if not nzo:
|
||||
@@ -256,9 +213,6 @@ class PostProcessor(Thread):
|
||||
history_db.close()
|
||||
nzo.purge_data(keep_basic=False, del_files=True)
|
||||
|
||||
# Processing done
|
||||
nzo.pp_active = False
|
||||
|
||||
self.remove(nzo)
|
||||
check_eoq = True
|
||||
|
||||
@@ -284,6 +238,7 @@ def process_job(nzo):
|
||||
postproc_time = 0
|
||||
script_log = ''
|
||||
script_line = ''
|
||||
crash_msg = ''
|
||||
|
||||
# Get the job flags
|
||||
nzo.save_attribs()
|
||||
@@ -540,15 +495,15 @@ def process_job(nzo):
|
||||
Rating.do.update_auto_flag(nzo.nzo_id, Rating.FLAG_EXPIRED, host)
|
||||
|
||||
except:
|
||||
logging.error(T('Post Processing Failed for %s (%s)'), filename, T('see logfile'))
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
|
||||
nzo.fail_msg = T('PostProcessing was aborted (%s)') % T('see logfile')
|
||||
logging.error(T('Post Processing Failed for %s (%s)'), filename, crash_msg)
|
||||
if not crash_msg:
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
crash_msg = T('see logfile')
|
||||
nzo.fail_msg = T('PostProcessing was aborted (%s)') % unicoder(crash_msg)
|
||||
notifier.send_notification(T('Download Failed'), filename, 'failed', nzo.cat)
|
||||
nzo.status = Status.FAILED
|
||||
par_error = True
|
||||
all_ok = False
|
||||
|
||||
if cfg.email_endjob():
|
||||
emailer.endjob(nzo.final_name, nzo.cat, all_ok, clip_path(workdir_complete), nzo.bytes_downloaded,
|
||||
nzo.fail_msg, nzo.unpack_info, '', '', 0)
|
||||
@@ -608,7 +563,7 @@ def process_job(nzo):
|
||||
def prepare_extraction_path(nzo):
|
||||
""" Based on the information that we have, generate
|
||||
the extraction path and create the directory.
|
||||
Separated so it can be called from DirectUnpacker
|
||||
Seperated so it can be called from DirectUnpacker
|
||||
"""
|
||||
one_folder = False
|
||||
marker_file = None
|
||||
@@ -713,7 +668,6 @@ def parring(nzo, workdir):
|
||||
logging.info('Re-added %s to queue', filename)
|
||||
if nzo.priority != TOP_PRIORITY:
|
||||
nzo.priority = REPAIR_PRIORITY
|
||||
nzo.status = Status.FETCHING
|
||||
sabnzbd.nzbqueue.NzbQueue.do.add(nzo)
|
||||
sabnzbd.downloader.Downloader.do.resume_from_postproc()
|
||||
|
||||
@@ -842,7 +796,7 @@ def cleanup_list(wdir, skip_nzb):
|
||||
if on_cleanup_list(filename, skip_nzb):
|
||||
try:
|
||||
logging.info("Removing unwanted file %s", path)
|
||||
remove_file(path)
|
||||
os.remove(path)
|
||||
except:
|
||||
logging.error(T('Removing %s failed'), clip_path(path))
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
@@ -889,14 +843,10 @@ def nzb_redirect(wdir, nzbname, pp, script, cat, priority):
|
||||
def one_file_or_folder(folder):
|
||||
""" If the dir only contains one file or folder, join that file/folder onto the path """
|
||||
if os.path.exists(folder) and os.path.isdir(folder):
|
||||
try:
|
||||
cont = os.listdir(folder)
|
||||
if len(cont) == 1:
|
||||
folder = os.path.join(folder, cont[0])
|
||||
folder = one_file_or_folder(folder)
|
||||
except WindowsError:
|
||||
# Can occur on paths it doesn't like, for example "C:"
|
||||
pass
|
||||
cont = os.listdir(folder)
|
||||
if len(cont) == 1:
|
||||
folder = os.path.join(folder, cont[0])
|
||||
folder = one_file_or_folder(folder)
|
||||
return folder
|
||||
|
||||
|
||||
@@ -926,7 +876,7 @@ def remove_samples(path):
|
||||
path = os.path.join(root, file_)
|
||||
try:
|
||||
logging.info("Removing unwanted sample file %s", path)
|
||||
remove_file(path)
|
||||
os.remove(path)
|
||||
except:
|
||||
logging.error(T('Removing %s failed'), clip_path(path))
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
@@ -979,7 +929,7 @@ def del_marker(path):
|
||||
if path and os.path.exists(path):
|
||||
logging.debug('Removing marker file %s', path)
|
||||
try:
|
||||
remove_file(path)
|
||||
os.remove(path)
|
||||
except:
|
||||
logging.info('Cannot remove marker file %s', path)
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
|
||||
@@ -384,6 +384,8 @@ class RSSQueue(object):
|
||||
n = 0
|
||||
if ('F' in reTypes or 'S' in reTypes) and (not season or not episode):
|
||||
season, episode = sabnzbd.newsunpack.analyse_show(title)[1:3]
|
||||
season = int_conv(season)
|
||||
episode = int_conv(episode)
|
||||
|
||||
# Match against all filters until an positive or negative match
|
||||
logging.debug('Size %s', size)
|
||||
@@ -715,11 +717,8 @@ def ep_match(season, episode, expr, title=None):
|
||||
"""
|
||||
m = _RE_SP.search(expr)
|
||||
if m:
|
||||
# Make sure they are all integers for comparison
|
||||
req_season = int(m.group(1))
|
||||
req_episode = int(m.group(2))
|
||||
season = int_conv(season)
|
||||
episode = int_conv(episode)
|
||||
if season > req_season or (season == req_season and episode >= req_episode):
|
||||
if title:
|
||||
show = expr[:m.start()].replace('.', ' ').replace('_', ' ').strip()
|
||||
|
||||
@@ -94,8 +94,8 @@ class SABTrayThread(SysTrayIconThread):
|
||||
self.counter += 1
|
||||
if self.counter > 10:
|
||||
self.sabpaused, bytes_left, bpsnow, time_left = api.fast_queue()
|
||||
mb_left = to_units(bytes_left)
|
||||
speed = to_units(bpsnow)
|
||||
mb_left = to_units(bytes_left, dec_limit=1)
|
||||
speed = to_units(bpsnow, dec_limit=1)
|
||||
|
||||
if self.sabpaused:
|
||||
self.hover_text = self.txt_paused
|
||||
@@ -110,14 +110,6 @@ class SABTrayThread(SysTrayIconThread):
|
||||
self.refresh_icon()
|
||||
self.counter = 0
|
||||
|
||||
# left-click handler
|
||||
def click(self, *args):
|
||||
# Make sure to stop the timer
|
||||
self.stop_click_timer()
|
||||
# Pause/resume and force update of icon/text
|
||||
self.pauseresume(None)
|
||||
self.counter = 11
|
||||
|
||||
# menu handler
|
||||
def opencomplete(self, icon):
|
||||
try:
|
||||
|
||||
@@ -78,8 +78,8 @@ class StatusIcon(Thread):
|
||||
# run this every updatefreq ms
|
||||
def run(self):
|
||||
self.sabpaused, bytes_left, bpsnow, time_left = api.fast_queue()
|
||||
mb_left = to_units(bytes_left)
|
||||
speed = to_units(bpsnow)
|
||||
mb_left = to_units(bytes_left, dec_limit=1)
|
||||
speed = to_units(bpsnow, dec_limit=1)
|
||||
|
||||
if self.sabpaused:
|
||||
self.tooltip = T('Paused')
|
||||
|
||||
@@ -666,10 +666,6 @@ SKIN_TEXT = {
|
||||
'explain-pushover_userkey' : TT('User Key (required)'), #: Pushover settings
|
||||
'opt-pushover_device' : TT('Device(s)'), #: Pushover settings
|
||||
'explain-pushover_device' : TT('Device(s) to which message should be sent'), #: Pushover settings
|
||||
'opt-pushover_emergency_retry' : TT('Emergency retry'), #: Pushover settings
|
||||
'explain-pushover_emergency_retry' : TT('How often (in seconds) the same notification will be sent'), #: Pushover settings
|
||||
'opt-pushover_emergency_expire' : TT('Emergency expire'), #: Pushover settings
|
||||
'explain-pushover_emergency_expire' : TT('How many seconds your notification will continue to be retried'), #: Pushover settings
|
||||
'section-Pushbullet' : TT('Pushbullet'), #: Header for Pushbullet notification section
|
||||
'opt-pushbullet_enable' : TT('Enable Pushbullet notifications'), #: Pushbullet settings
|
||||
'explain-pushbullet_enable' : TT('Requires a Pushbullet account'), #: Pushbulletsettings
|
||||
@@ -862,7 +858,6 @@ SKIN_TEXT = {
|
||||
'Glitter-pausePromptFail': TT('Sorry, we could not interpret that. Try again.'),
|
||||
'Glitter-pauseFor' : TT('Pause for...'),
|
||||
'Glitter-refresh' : TT('Refresh'),
|
||||
'Glitter-logText' : TT('All usernames, passwords and API-keys are automatically removed from the log and the included copy of your settings.'),
|
||||
'Glitter-sortAgeAsc' : TT('Sort by Age <small>Oldest→Newest</small>'),
|
||||
'Glitter-sortAgeDesc' : TT('Sort by Age <small>Newest→Oldest</small>'),
|
||||
'Glitter-sortNameAsc' : TT('Sort by Name <small>A→Z</small>'),
|
||||
|
||||
@@ -38,7 +38,7 @@ RE_SAMPLE = re.compile(sample_match, re.I)
|
||||
EXCLUDED_FILE_EXTS = ('.vob', '.bin')
|
||||
|
||||
LOWERCASE = ('the', 'of', 'and', 'at', 'vs', 'a', 'an', 'but', 'nor', 'for', 'on',
|
||||
'so', 'yet', 'with')
|
||||
'so', 'yet')
|
||||
UPPERCASE = ('III', 'II', 'IV')
|
||||
|
||||
REPLACE_AFTER = {
|
||||
|
||||
@@ -30,7 +30,7 @@ from httplib import IncompleteRead
|
||||
from threading import Thread
|
||||
|
||||
import sabnzbd
|
||||
from sabnzbd.constants import DEF_TIMEOUT, MAX_URL_RETRIES, FUTURE_Q_FOLDER, Status
|
||||
from sabnzbd.constants import FUTURE_Q_FOLDER, Status
|
||||
from sabnzbd.encoding import unicoder
|
||||
import sabnzbd.misc as misc
|
||||
import sabnzbd.dirscanner as dirscanner
|
||||
@@ -59,17 +59,8 @@ class URLGrabber(Thread):
|
||||
|
||||
def add(self, url, future_nzo, when=None):
|
||||
""" Add an URL to the URLGrabber queue, 'when' is seconds from now """
|
||||
if future_nzo and when:
|
||||
# Always increase counter
|
||||
future_nzo.url_tries += 1
|
||||
|
||||
# Too many tries? Cancel
|
||||
if future_nzo.url_tries > MAX_URL_RETRIES:
|
||||
bad_fetch(future_nzo, url, T('Maximum retries'))
|
||||
return
|
||||
|
||||
future_nzo.url_wait = time.time() + when
|
||||
|
||||
if when and future_nzo:
|
||||
future_nzo.wait = time.time() + when
|
||||
self.queue.put((url, future_nzo))
|
||||
|
||||
def stop(self):
|
||||
@@ -90,7 +81,7 @@ class URLGrabber(Thread):
|
||||
|
||||
if future_nzo:
|
||||
# Re-queue when too early and still active
|
||||
if future_nzo.url_wait and future_nzo.url_wait > time.time():
|
||||
if future_nzo.wait and future_nzo.wait > time.time():
|
||||
self.add(url, future_nzo)
|
||||
time.sleep(1.0)
|
||||
continue
|
||||
@@ -196,7 +187,7 @@ class URLGrabber(Thread):
|
||||
retry = True
|
||||
fn = None
|
||||
elif retry:
|
||||
fn, msg, retry, wait, data = _analyse(fn, url, future_nzo)
|
||||
fn, msg, retry, wait, data = _analyse(fn, url)
|
||||
|
||||
if not fn:
|
||||
if retry:
|
||||
@@ -309,28 +300,23 @@ def _build_request(url):
|
||||
return urllib2.urlopen(req)
|
||||
|
||||
|
||||
def _analyse(fn, url, future_nzo):
|
||||
def _analyse(fn, url):
|
||||
""" Analyze response of indexer
|
||||
returns fn|None, error-message|None, retry, wait-seconds, data
|
||||
"""
|
||||
data = None
|
||||
if not fn or fn.code != 200:
|
||||
logging.debug('No usable response from indexer, retry after 60 sec')
|
||||
if fn:
|
||||
msg = fn.msg
|
||||
else:
|
||||
msg = ''
|
||||
|
||||
# Increasing wait-time in steps for standard errors
|
||||
when = DEF_TIMEOUT * (future_nzo.url_tries + 1)
|
||||
logging.debug('No usable response from indexer, retry after %s sec', when)
|
||||
return None, msg, True, when, data
|
||||
return None, msg, True, 60, data
|
||||
|
||||
# Check for an error response
|
||||
if not fn or fn.msg != 'OK':
|
||||
# Increasing wait-time in steps for standard errors
|
||||
when = DEF_TIMEOUT * (future_nzo.url_tries + 1)
|
||||
logging.debug('Received nothing from indexer, retry after %s sec', when)
|
||||
return None, fn.msg, True, when, data
|
||||
logging.debug('Received nothing from indexer, retry after 60 sec')
|
||||
return None, fn.msg, True, 60, data
|
||||
|
||||
return fn, fn.msg, False, 0, data
|
||||
|
||||
|
||||
180
sabnzbd/utils/subprocess_fix.py
Normal file
180
sabnzbd/utils/subprocess_fix.py
Normal file
@@ -0,0 +1,180 @@
|
||||
## Fixing python 2.7 windows unicode issue with ``subprocess.Popen``.
|
||||
|
||||
## Copied from
|
||||
## http://vaab.blog.kal.fr/2017/03/16/fixing-windows-python-2-7-unicode-issue-with-subprocesss-popen/
|
||||
## https://gist.github.com/vaab/2ad7051fc193167f15f85ef573e54eb9
|
||||
|
||||
## issue: https://bugs.python.org/issue19264
|
||||
import os
|
||||
import time
|
||||
import ctypes
|
||||
import subprocess
|
||||
import _subprocess
|
||||
from ctypes import byref, windll, c_char_p, c_wchar_p, c_void_p, \
|
||||
Structure, sizeof, c_wchar, WinError
|
||||
from ctypes.wintypes import BYTE, WORD, LPWSTR, BOOL, DWORD, LPVOID, \
|
||||
HANDLE
|
||||
|
||||
|
||||
##
|
||||
## Special counter because this function cannot
|
||||
## be called within 1 second from each other!
|
||||
##
|
||||
_NEXT_PROCESS_START = 0.0
|
||||
|
||||
|
||||
##
|
||||
## Types
|
||||
##
|
||||
|
||||
CREATE_UNICODE_ENVIRONMENT = 0x00000400
|
||||
LPCTSTR = c_char_p
|
||||
LPTSTR = c_wchar_p
|
||||
LPSECURITY_ATTRIBUTES = c_void_p
|
||||
LPBYTE = ctypes.POINTER(BYTE)
|
||||
|
||||
class STARTUPINFOW(Structure):
|
||||
_fields_ = [
|
||||
("cb", DWORD), ("lpReserved", LPWSTR),
|
||||
("lpDesktop", LPWSTR), ("lpTitle", LPWSTR),
|
||||
("dwX", DWORD), ("dwY", DWORD),
|
||||
("dwXSize", DWORD), ("dwYSize", DWORD),
|
||||
("dwXCountChars", DWORD), ("dwYCountChars", DWORD),
|
||||
("dwFillAtrribute", DWORD), ("dwFlags", DWORD),
|
||||
("wShowWindow", WORD), ("cbReserved2", WORD),
|
||||
("lpReserved2", LPBYTE), ("hStdInput", HANDLE),
|
||||
("hStdOutput", HANDLE), ("hStdError", HANDLE),
|
||||
]
|
||||
|
||||
LPSTARTUPINFOW = ctypes.POINTER(STARTUPINFOW)
|
||||
|
||||
|
||||
class PROCESS_INFORMATION(Structure):
|
||||
_fields_ = [
|
||||
("hProcess", HANDLE), ("hThread", HANDLE),
|
||||
("dwProcessId", DWORD), ("dwThreadId", DWORD),
|
||||
]
|
||||
|
||||
LPPROCESS_INFORMATION = ctypes.POINTER(PROCESS_INFORMATION)
|
||||
|
||||
|
||||
class DUMMY_HANDLE(ctypes.c_void_p):
|
||||
|
||||
def __init__(self, *a, **kw):
|
||||
super(DUMMY_HANDLE, self).__init__(*a, **kw)
|
||||
self.closed = False
|
||||
|
||||
def Close(self):
|
||||
if not self.closed:
|
||||
windll.kernel32.CloseHandle(self)
|
||||
self.closed = True
|
||||
|
||||
def __int__(self):
|
||||
return self.value
|
||||
|
||||
|
||||
CreateProcessW = windll.kernel32.CreateProcessW
|
||||
CreateProcessW.argtypes = [
|
||||
LPCTSTR, LPTSTR, LPSECURITY_ATTRIBUTES,
|
||||
LPSECURITY_ATTRIBUTES, BOOL, DWORD, LPVOID, LPCTSTR,
|
||||
LPSTARTUPINFOW, LPPROCESS_INFORMATION,
|
||||
]
|
||||
CreateProcessW.restype = BOOL
|
||||
|
||||
|
||||
##
|
||||
## Patched functions/classes
|
||||
##
|
||||
|
||||
def CreateProcess(executable, args, _p_attr, _t_attr,
|
||||
inherit_handles, creation_flags, env, cwd,
|
||||
startup_info):
|
||||
"""Create a process supporting unicode executable and args for win32
|
||||
|
||||
Python implementation of CreateProcess using CreateProcessW for Win32
|
||||
|
||||
"""
|
||||
# Do we need to delay?
|
||||
global _NEXT_PROCESS_START
|
||||
diff_start = _NEXT_PROCESS_START - time.time()
|
||||
if(diff_start > 0.0):
|
||||
# Wait ourselves and make sure others also wait
|
||||
_NEXT_PROCESS_START += 1.0
|
||||
time.sleep(diff_start)
|
||||
else:
|
||||
_NEXT_PROCESS_START = time.time() + 1.0
|
||||
|
||||
si = STARTUPINFOW(
|
||||
dwFlags=startup_info.dwFlags,
|
||||
wShowWindow=startup_info.wShowWindow,
|
||||
cb=sizeof(STARTUPINFOW),
|
||||
)
|
||||
|
||||
# Only cast to ints when it's given
|
||||
if startup_info.hStdInput:
|
||||
si.hStdInput = int(startup_info.hStdInput)
|
||||
if startup_info.hStdOutput:
|
||||
si.hStdOutput = int(startup_info.hStdOutput)
|
||||
if startup_info.hStdError:
|
||||
si.hStdError = int(startup_info.hStdError)
|
||||
|
||||
wenv = None
|
||||
if env is not None:
|
||||
## LPCWSTR seems to be c_wchar_p, so let's say CWSTR is c_wchar
|
||||
env = (unicode("").join([
|
||||
unicode("%s=%s\0") % (k, v)
|
||||
for k, v in env.items()])) + unicode("\0")
|
||||
wenv = (c_wchar * len(env))()
|
||||
wenv.value = env
|
||||
|
||||
pi = PROCESS_INFORMATION()
|
||||
creation_flags |= CREATE_UNICODE_ENVIRONMENT
|
||||
|
||||
if CreateProcessW(executable, args, None, None,
|
||||
inherit_handles, creation_flags,
|
||||
wenv, cwd, byref(si), byref(pi)):
|
||||
return (DUMMY_HANDLE(pi.hProcess), DUMMY_HANDLE(pi.hThread),
|
||||
pi.dwProcessId, pi.dwThreadId)
|
||||
raise WinError()
|
||||
|
||||
|
||||
class Popen(subprocess.Popen):
|
||||
"""This superseeds Popen and corrects a bug in cPython 2.7 implem"""
|
||||
|
||||
def _execute_child(self, args, executable, preexec_fn, close_fds,
|
||||
cwd, env, universal_newlines,
|
||||
startupinfo, creationflags, shell, to_close,
|
||||
p2cread, p2cwrite,
|
||||
c2pread, c2pwrite,
|
||||
errread, errwrite):
|
||||
"""Code from part of _execute_child from Python 2.7 (9fbb65e)
|
||||
|
||||
There are only 2 little changes concerning the construction of
|
||||
the the final string in shell mode: we preempt the creation of
|
||||
the command string when shell is True, because original function
|
||||
will try to encode unicode args which we want to avoid to be able to
|
||||
sending it as-is to ``CreateProcess``.
|
||||
|
||||
"""
|
||||
if not isinstance(args, subprocess.types.StringTypes):
|
||||
args = subprocess.list2cmdline(args)
|
||||
|
||||
if startupinfo is None:
|
||||
startupinfo = subprocess.STARTUPINFO()
|
||||
if shell:
|
||||
startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW
|
||||
startupinfo.wShowWindow = _subprocess.SW_HIDE
|
||||
comspec = os.environ.get("COMSPEC", unicode("cmd.exe"))
|
||||
args = unicode('{} /c "{}"').format(comspec, args)
|
||||
if (_subprocess.GetVersion() >= 0x80000000 or
|
||||
os.path.basename(comspec).lower() == "command.com"):
|
||||
w9xpopen = self._find_w9xpopen()
|
||||
args = unicode('"%s" %s') % (w9xpopen, args)
|
||||
creationflags |= _subprocess.CREATE_NEW_CONSOLE
|
||||
|
||||
super(Popen, self)._execute_child(args, executable,
|
||||
preexec_fn, close_fds, cwd, env, universal_newlines,
|
||||
startupinfo, creationflags, False, to_close, p2cread,
|
||||
p2cwrite, c2pread, c2pwrite, errread, errwrite)
|
||||
|
||||
_subprocess.CreateProcess = CreateProcess
|
||||
@@ -4,14 +4,12 @@
|
||||
# http://www.brunningonline.net/simon/blog/archives/SysTrayIcon.py.html
|
||||
# modified on 2011-10-04 by Jan Schejbal to support threading and preload icons
|
||||
# override doUpdates to perform actions inside the icon thread
|
||||
# override click to perform actions when left-clicking the icon
|
||||
|
||||
import os
|
||||
import pywintypes
|
||||
import win32api
|
||||
import win32con
|
||||
import win32gui_struct
|
||||
import timer
|
||||
try:
|
||||
import winxpgui as win32gui
|
||||
except ImportError:
|
||||
@@ -47,7 +45,6 @@ class SysTrayIconThread(Thread):
|
||||
self.menu_actions_by_id = dict(self.menu_actions_by_id)
|
||||
del self._next_action_id
|
||||
|
||||
self.click_timer = None
|
||||
self.default_menu_index = (default_menu_index or 0)
|
||||
self.window_class_name = window_class_name or "SysTrayIconPy"
|
||||
|
||||
@@ -92,7 +89,7 @@ class SysTrayIconThread(Thread):
|
||||
sleep(0.100)
|
||||
win32gui.Shell_NotifyIcon(win32gui.NIM_DELETE, (self.hwnd, 0))
|
||||
|
||||
# Override this
|
||||
# override this
|
||||
def doUpdates(self):
|
||||
pass
|
||||
|
||||
@@ -178,19 +175,12 @@ class SysTrayIconThread(Thread):
|
||||
win32gui.PostQuitMessage(0) # Terminate the app.
|
||||
|
||||
def notify(self, hwnd, msg, wparam, lparam):
|
||||
# Double click is actually 1 single click followed
|
||||
# by a double-click event, no way to differentiate
|
||||
# So we need a timed callback to cancel
|
||||
if lparam == win32con.WM_LBUTTONDBLCLK:
|
||||
self.execute_menu_option(self.default_menu_index + self.FIRST_ID)
|
||||
self.stop_click_timer()
|
||||
elif lparam == win32con.WM_RBUTTONUP:
|
||||
self.show_menu()
|
||||
elif lparam == win32con.WM_LBUTTONDOWN:
|
||||
# Wrapper of win32api, timeout is in ms
|
||||
# We need to wait at least untill what user has defined as double click
|
||||
self.stop_click_timer()
|
||||
self.click_timer = timer.set_timer(win32gui.GetDoubleClickTime(), self.click)
|
||||
elif lparam == win32con.WM_LBUTTONUP:
|
||||
pass
|
||||
return True
|
||||
|
||||
def show_menu(self):
|
||||
@@ -214,17 +204,6 @@ class SysTrayIconThread(Thread):
|
||||
# Weird PyWin/win32gui bug, just ignore it for now
|
||||
pass
|
||||
|
||||
# Override this for left-click action
|
||||
# Need to call the stop-timer in that function!
|
||||
def click(self, *args):
|
||||
pass
|
||||
|
||||
def stop_click_timer(self):
|
||||
# Stop the timer
|
||||
if self.click_timer:
|
||||
timer.kill_timer(self.click_timer)
|
||||
self.click_timer = None
|
||||
|
||||
def create_menu(self, menu, menu_options):
|
||||
for option_text, option_icon, option_action, option_id in menu_options[::-1]:
|
||||
if option_icon:
|
||||
|
||||
@@ -24,7 +24,7 @@ import logging
|
||||
import os
|
||||
from sabnzbd.encoding import unicoder
|
||||
import sabnzbd.cfg as cfg
|
||||
from sabnzbd.misc import get_ext, get_filename, get_from_url
|
||||
from sabnzbd.misc import get_ext, get_filename
|
||||
import sabnzbd.newsunpack
|
||||
from sabnzbd.constants import VALID_ARCHIVES
|
||||
|
||||
@@ -47,7 +47,7 @@ def upload_file(url, fp):
|
||||
password = cfg.password()
|
||||
if username and password:
|
||||
url = '%s&ma_username=%s&ma_password=%s' % (url, username, password)
|
||||
get_from_url(url)
|
||||
sabnzbd.newsunpack.get_from_url(url)
|
||||
except:
|
||||
logging.error("Failed to upload file: %s", fp)
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
|
||||
@@ -4,5 +4,5 @@
|
||||
|
||||
# You MUST use double quotes (so " and not ')
|
||||
|
||||
__version__ = "2.4.0-develop"
|
||||
__baseline__ = "unknown"
|
||||
__version__ = "2.3.0"
|
||||
__baseline__ = "ba7d906beaff948ba7870903f3dbaa1dd31e2e80"
|
||||
|
||||
@@ -1,160 +0,0 @@
|
||||
#!/usr/bin/python -OO
|
||||
# Copyright 2008-2017 The SABnzbd-Team <team@sabnzbd.org>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
"""
|
||||
|
||||
Deobfuscation post-processing script:
|
||||
|
||||
Will check in the completed job folder if maybe there are par2 files,
|
||||
for example "rename.par2", and use those to rename the files.
|
||||
If there is no "rename.par2" available, it will rename the largest
|
||||
file to the job-name in the queue.
|
||||
|
||||
NOTES:
|
||||
1) To use this script you need Python installed on your system and
|
||||
select "Add to path" during its installation. Select this folder in
|
||||
Config > Folders > Scripts Folder and select this script for each job
|
||||
you want it sued for, or link it to a category in Config > Categories.
|
||||
2) Beware that files on the 'Cleanup List' are removed before
|
||||
scripts are called and if any of them happen to be required by
|
||||
the found par2 file, it will fail.
|
||||
3) If there are multiple larger (>40MB) files, then the script will not
|
||||
rename anything, since it could be a multi-pack.
|
||||
4) If you want to modify this script, make sure to copy it out
|
||||
of this directory, or it will be overwritten when SABnzbd is updated.
|
||||
5) Feedback or bugs in this script can be reported in on our forum:
|
||||
https://forums.sabnzbd.org/viewforum.php?f=9
|
||||
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import fnmatch
|
||||
import subprocess
|
||||
|
||||
# Files to exclude and minimal file size for renaming
|
||||
EXCLUDED_FILE_EXTS = ('.vob', '.bin')
|
||||
MIN_FILE_SIZE = 40*1024*1024
|
||||
|
||||
# Are we being called from SABnzbd?
|
||||
if not os.environ.get('SAB_VERSION'):
|
||||
print "This script needs to be called from SABnzbd as post-processing script."
|
||||
sys.exit(1)
|
||||
|
||||
def print_splitter():
|
||||
""" Simple helper function """
|
||||
print '\n------------------------\n'
|
||||
|
||||
# Windows or others?
|
||||
par2_command = os.environ['SAB_PAR2_COMMAND']
|
||||
if os.environ['SAB_MULTIPAR_COMMAND']:
|
||||
par2_command = os.environ['SAB_MULTIPAR_COMMAND']
|
||||
|
||||
# Diagnostic info
|
||||
print_splitter()
|
||||
print 'SABnzbd version: ', os.environ['SAB_VERSION']
|
||||
print 'Job location: ', os.environ['SAB_COMPLETE_DIR']
|
||||
print 'Par2-command: ', par2_command
|
||||
print_splitter()
|
||||
|
||||
# Search for par2 files
|
||||
matches = []
|
||||
for root, dirnames, filenames in os.walk(os.environ['SAB_COMPLETE_DIR']):
|
||||
for filename in fnmatch.filter(filenames, '*.par2'):
|
||||
matches.append(os.path.join(root, filename))
|
||||
print 'Found file:', os.path.join(root, filename)
|
||||
|
||||
# Found any par2 files we can use?
|
||||
run_renamer = True
|
||||
if not matches:
|
||||
print "No par2 files found to process."
|
||||
|
||||
# Run par2 from SABnzbd on them
|
||||
for par2_file in matches:
|
||||
# Build command, make it check the whole directory
|
||||
wildcard = os.path.join(os.environ['SAB_COMPLETE_DIR'], '*')
|
||||
command = [str(par2_command), 'r', par2_file, wildcard]
|
||||
|
||||
# Start command
|
||||
print_splitter()
|
||||
print 'Starting command: ', repr(command)
|
||||
try:
|
||||
result = subprocess.check_output(command)
|
||||
except subprocess.CalledProcessError as e:
|
||||
# Multipar also gives non-zero in case of succes
|
||||
result = e.output
|
||||
|
||||
# Show output
|
||||
print_splitter()
|
||||
print result
|
||||
print_splitter()
|
||||
|
||||
# Last status-line for the History
|
||||
# Check if the magic words are there
|
||||
if 'Repaired successfully' in result or 'All files are correct' in result or \
|
||||
'Repair complete' in result or 'All Files Complete' in result or 'PAR File(s) Incomplete' in result:
|
||||
print 'Recursive repair/verify finished.'
|
||||
run_renamer = False
|
||||
else:
|
||||
print 'Recursive repair/verify did not complete!'
|
||||
|
||||
|
||||
# No matches? Then we try to rename the largest file to the job-name
|
||||
if run_renamer:
|
||||
print_splitter()
|
||||
print 'Trying to see if there are large files to rename'
|
||||
print_splitter()
|
||||
|
||||
# If there are more larger files, we don't rename
|
||||
largest_file = None
|
||||
for root, dirnames, filenames in os.walk(os.environ['SAB_COMPLETE_DIR']):
|
||||
for filename in filenames:
|
||||
full_path = os.path.join(root, filename)
|
||||
file_size = os.path.getsize(full_path)
|
||||
# Do we count this file?
|
||||
if file_size > MIN_FILE_SIZE and os.path.splitext(filename)[1].lower() not in EXCLUDED_FILE_EXTS:
|
||||
# Did we already found one?
|
||||
if largest_file:
|
||||
print 'Found:', largest_file
|
||||
print 'Found:', full_path
|
||||
print_splitter()
|
||||
print 'Found multiple larger files, aborting.'
|
||||
largest_file = None
|
||||
break
|
||||
largest_file = full_path
|
||||
|
||||
# Found something large enough?
|
||||
if largest_file:
|
||||
# We don't need to do any cleaning of dir-names
|
||||
# since SABnzbd already did that!
|
||||
new_name = '%s%s' % (os.path.join(os.environ['SAB_COMPLETE_DIR'], os.environ['SAB_FINAL_NAME']), os.path.splitext(largest_file)[1].lower())
|
||||
print 'Renaming %s to %s' % (largest_file, new_name)
|
||||
|
||||
# With retries for Windows
|
||||
for r in range(3):
|
||||
try:
|
||||
os.rename(largest_file, new_name)
|
||||
print 'Renaming done!'
|
||||
break
|
||||
except:
|
||||
time.sleep(1)
|
||||
else:
|
||||
print 'No par2 files or large files found'
|
||||
|
||||
# Always exit with succes-code
|
||||
sys.exit(0)
|
||||
@@ -1,15 +1,15 @@
|
||||
@echo off
|
||||
rem Example of a post processing script for SABnzbd
|
||||
|
||||
echo.
|
||||
echo Running in directory "%~d0%~p0"
|
||||
echo.
|
||||
echo The first parameter (result-dir) = %1
|
||||
echo The second parameter (nzb-name) = %2
|
||||
echo The third parameter (nice name) = %3
|
||||
echo The fourth parameter (newzbin #) = %4
|
||||
echo The fifth parameter (category) = %5
|
||||
echo The sixth parameter (group) = %6
|
||||
echo The seventh parameter (status) = %7
|
||||
echo The eight parameter (failure_url)= %8
|
||||
echo.
|
||||
@echo off
|
||||
rem Example of a post processing script for SABnzbd
|
||||
|
||||
echo.
|
||||
echo Running in directory "%~d0%~p0"
|
||||
echo.
|
||||
echo The first parameter (result-dir) = %1
|
||||
echo The second parameter (nzb-name) = %2
|
||||
echo The third parameter (nice name) = %3
|
||||
echo The fourth parameter (newzbin #) = %4
|
||||
echo The fifth parameter (category) = %5
|
||||
echo The sixth parameter (group) = %6
|
||||
echo The seventh parameter (status) = %7
|
||||
echo The eight parameter (failure_url)= %8
|
||||
echo.
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# Example Post-Processing Script for SABnzbd (2.3.1 and higher), written in Python.
|
||||
# For Linux, MacOS, Windows and any other platform with Python
|
||||
# See https://sabnzbd.org/wiki/scripts/post-processing-scripts for details
|
||||
#
|
||||
# Example test run on Linux:
|
||||
# env SAB_VERSION=X.Y SAB_AVG_BPS=666 python ./Sample-PostProc.py somedir222 nzbname CleanJobName123 Index12 Cat88 MyGroup PP0 https://example.com/
|
||||
|
||||
import sys, os
|
||||
|
||||
# Raw parsing of input parameters en SABnzbd environment variables
|
||||
counter = 0
|
||||
print "\nINPUT from argv:\n"
|
||||
for item in sys.argv:
|
||||
print "Argument", counter, ":", item
|
||||
counter += 1
|
||||
|
||||
print "\nINPUT from environment variables (only SAB specifics):\n"
|
||||
for item in os.environ:
|
||||
if item.find("SAB_") == 0:
|
||||
print item, os.environ[item]
|
||||
|
||||
# More intelligent parsing:
|
||||
try:
|
||||
(scriptname,directory,orgnzbname,jobname,reportnumber,category,group,postprocstatus,url) = sys.argv
|
||||
except:
|
||||
print "No SAB compliant number of commandline parameters found (should be 8):", len(sys.argv)-1
|
||||
sys.exit(1) # non-zero return code
|
||||
|
||||
# Some examples:
|
||||
print "\nExamples of some specific values:\n"
|
||||
print "jobname is", jobname
|
||||
try:
|
||||
sabversion = os.environ['SAB_VERSION']
|
||||
print "sabversion is", sabversion
|
||||
except:
|
||||
pass
|
||||
|
||||
''' your code here '''
|
||||
|
||||
# We're done:
|
||||
print "\nScript done. All OK." # the last line will appear in the SABnzb History GUI
|
||||
sys.exit(0) # The result code towards SABnzbd
|
||||
|
||||
55
win/unzip/LICENSE
Normal file
55
win/unzip/LICENSE
Normal file
@@ -0,0 +1,55 @@
|
||||
This is version 2005-Feb-10 of the Info-ZIP copyright and license.
|
||||
The definitive version of this document should be available at
|
||||
ftp://ftp.info-zip.org/pub/infozip/license.html indefinitely.
|
||||
|
||||
|
||||
Copyright (c) 1990-2005 Info-ZIP. All rights reserved.
|
||||
|
||||
For the purposes of this copyright and license, "Info-ZIP" is defined as
|
||||
the following set of individuals:
|
||||
|
||||
Mark Adler, John Bush, Karl Davis, Harald Denker, Jean-Michel Dubois,
|
||||
Jean-loup Gailly, Hunter Goatley, Ed Gordon, Ian Gorman, Chris Herborth,
|
||||
Dirk Haase, Greg Hartwig, Robert Heath, Jonathan Hudson, Paul Kienitz,
|
||||
David Kirschbaum, Johnny Lee, Onno van der Linden, Igor Mandrichenko,
|
||||
Steve P. Miller, Sergio Monesi, Keith Owens, George Petrov, Greg Roelofs,
|
||||
Kai Uwe Rommel, Steve Salisbury, Dave Smith, Steven M. Schweda,
|
||||
Christian Spieler, Cosmin Truta, Antoine Verheijen, Paul von Behren,
|
||||
Rich Wales, Mike White
|
||||
|
||||
This software is provided "as is," without warranty of any kind, express
|
||||
or implied. In no event shall Info-ZIP or its contributors be held liable
|
||||
for any direct, indirect, incidental, special or consequential damages
|
||||
arising out of the use of or inability to use this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
definition, disclaimer, and this list of conditions.
|
||||
|
||||
2. Redistributions in binary form (compiled executables) must reproduce
|
||||
the above copyright notice, definition, disclaimer, and this list of
|
||||
conditions in documentation and/or other materials provided with the
|
||||
distribution. The sole exception to this condition is redistribution
|
||||
of a standard UnZipSFX binary (including SFXWiz) as part of a
|
||||
self-extracting archive; that is permitted without inclusion of this
|
||||
license, as long as the normal SFX banner has not been removed from
|
||||
the binary or disabled.
|
||||
|
||||
3. Altered versions--including, but not limited to, ports to new operating
|
||||
systems, existing ports with new graphical interfaces, and dynamic,
|
||||
shared, or static library versions--must be plainly marked as such
|
||||
and must not be misrepresented as being the original source. Such
|
||||
altered versions also must not be misrepresented as being Info-ZIP
|
||||
releases--including, but not limited to, labeling of the altered
|
||||
versions with the names "Info-ZIP" (or any variation thereof, including,
|
||||
but not limited to, different capitalizations), "Pocket UnZip," "WiZ"
|
||||
or "MacZip" without the explicit permission of Info-ZIP. Such altered
|
||||
versions are further prohibited from misrepresentative use of the
|
||||
Zip-Bugs or Info-ZIP e-mail addresses or of the Info-ZIP URL(s).
|
||||
|
||||
4. Info-ZIP retains the right to use the names "Info-ZIP," "Zip," "UnZip,"
|
||||
"UnZipSFX," "WiZ," "Pocket UnZip," "Pocket Zip," and "MacZip" for its
|
||||
own source and binary releases.
|
||||
288
win/unzip/README
Normal file
288
win/unzip/README
Normal file
@@ -0,0 +1,288 @@
|
||||
This is the README file for the 28 February 2005 public release of the
|
||||
Info-ZIP group's portable UnZip zipfile-extraction program (and related
|
||||
utilities).
|
||||
|
||||
unzip552.zip portable UnZip, version 5.52, source code distribution
|
||||
unzip552.tar.Z same as above, but compress'd tar format
|
||||
unzip552.tar.gz same as above, but gzip'd tar format
|
||||
|
||||
__________________________________________________________________________
|
||||
|
||||
BEFORE YOU ASK: UnZip, its companion utility Zip, and related utilities
|
||||
and support files can be found in many places; read the file "WHERE" for
|
||||
further details. To contact the authors with suggestions, bug reports,
|
||||
or fixes, continue reading this file (README) and, if this is part of a
|
||||
source distribution, the file "ZipPorts" in the proginfo directory. Also
|
||||
in source distributions: read "BUGS" for a list of known bugs, non-bugs
|
||||
and possible future bugs; INSTALL for instructions on how to build UnZip;
|
||||
and "Contents" for a commented listing of all the distributed files.
|
||||
__________________________________________________________________________
|
||||
|
||||
|
||||
GENERAL INFO
|
||||
------------
|
||||
UnZip is an extraction utility for archives compressed in .zip format (also
|
||||
called "zipfiles"). Although highly compatible both with PKWARE's PKZIP
|
||||
and PKUNZIP utilities for MS-DOS and with Info-ZIP's own Zip program, our
|
||||
primary objectives have been portability and non-MSDOS functionality.
|
||||
|
||||
This version of UnZip has been ported to a stupendous array of hardware--
|
||||
from micros to supercomputers--and operating systems: Unix (many flavors),
|
||||
VMS, OS/2 (including DLL version), Windows NT and Windows 95 (including DLL
|
||||
version), Windows CE (GUI version), Windows 3.x (including DLL version),
|
||||
MS-DOS, AmigaDOS, Atari TOS, Acorn RISC OS, BeOS, Macintosh (GUI version),
|
||||
SMS/QDOS, MVS, VM/CMS, FlexOS, Tandem NSK, Human68k (mostly), AOS/VS (partly)
|
||||
and TOPS-20 (partly). UnZip features not found in PKUNZIP include source
|
||||
code; default extraction of directory trees (with a switch to defeat this,
|
||||
rather than the reverse); system-specific extended file attributes; and, of
|
||||
course, the ability to run under most of your favorite operating systems.
|
||||
Plus, it's free. :-)
|
||||
|
||||
For source distributions, see the main Contents file for a list of what's
|
||||
included, and read INSTALL for instructions on compiling (including OS-
|
||||
specific comments). The individual operating systems' Contents files (for
|
||||
example, vms/Contents) may list important compilation info in addition to
|
||||
explaining what files are what, so be sure to read them. Some of the ports
|
||||
have their own, special README files, so be sure to look for those, too.
|
||||
|
||||
See unzip.1 or unzip.txt for usage (or the corresponding UnZipSFX, ZipInfo,
|
||||
fUnZip and ZipGrep docs). For VMS, unzip_def.rnh or unzip_cli.help may be
|
||||
compiled into unzip.hlp and installed as a normal VMS help entry; see
|
||||
vms/descrip.mms.
|
||||
|
||||
|
||||
CHANGES AND NEW FEATURES
|
||||
------------------------
|
||||
The 5.52 maintenance release fixes a few minor problems found in the 5.51
|
||||
release, closes some more security holes, adds a new AtheOS port, and
|
||||
contains a Win32 extra-field code cleanup that was not finished earlier.
|
||||
The most important changes are:
|
||||
|
||||
- (re)enabled unshrinking support by default, the LZW patents have expired
|
||||
- fixed an extraction size bug for encrypted stored entries (12 excess bytes
|
||||
were written with 5.51)
|
||||
- fixed false "uncompressed size mismatch" messages when extracting
|
||||
encrypted archive entries
|
||||
- do not restore SUID/SGID/Tacky attribute bits on Unix (BeOS, AtheOS)
|
||||
unless explicitely requested by new "-K" command line qualifier
|
||||
- optional support for "-W" qualifier to modify the pattern matching syntax
|
||||
(with -W: "*" stops at directory delimiter, "**" matches unlimited)
|
||||
- prevent buffer overflow caused by bogus extra-long Zipfile specification
|
||||
- performance enhancements for VMS port
|
||||
- fixed windll interface handling of its extraction mode qualifiers
|
||||
nfflag, ExtractOnlyNewer, noflag, PromptToOverwrite; added detailed
|
||||
explanation of their meanings and interactions to the windll documentation
|
||||
|
||||
The 5.51 maintenance release adds a command-line CE port, intended for
|
||||
batch processing. With the integration of this port, the pUnZip port
|
||||
has been revised and "revitalized".
|
||||
The most important changes for the general public are a number of
|
||||
bug fixes, mostly related to security issues:
|
||||
|
||||
- repair a serious bug in the textmode output conversion code for the 16-bit
|
||||
ports (16-bit MSDOS, OS/2 1.x, some variants of AMIGA, possibly others)
|
||||
which was introduced by the Deflate64 support of release 5.5
|
||||
- fix a long standing bug in the the inflate decompression method that
|
||||
prevented correct extraction in some rare cases
|
||||
- fixed holes in parent dir traversal security code (e.g.: ".^C." slipped
|
||||
through the previous version of the check code)
|
||||
- fixed security hole: check naming consistency in local and central header
|
||||
- fixed security hole: prevent extracted symlinks from redirecting file
|
||||
extraction paths
|
||||
|
||||
The main addition in the 5.5 release is support for PKWARE's new Deflate64(tm)
|
||||
algorithm, which appeared first in PKZIP 4.0 (published November 2000).
|
||||
As usual, some other bugfixes and clean-ups have been integrated:
|
||||
|
||||
- support for Deflate64 (Zip compression method #9)
|
||||
- support for extracting VMS variable length record text files on
|
||||
any system
|
||||
- optional "cheap autorun" feature for the SFX stub
|
||||
- security fixes:
|
||||
* strip leading slash from stored pathspecs,
|
||||
* remove "../" parent dir path components from extracted file names
|
||||
- new option "-:" to allow verbatim extraction of file names containing
|
||||
"../" parent dir path specs
|
||||
- fixed file handle leak for the DLL code
|
||||
- repaired OS2 & WinNT ACL extraction which was broken in 5.42
|
||||
|
||||
The 5.42 maintenance release fixes more bugs and cleans up the redistribution
|
||||
conditions:
|
||||
|
||||
- removal of unreduce.c and amiga/timelib.c code to get rid of the last
|
||||
distribution restrictions beyond the BSD-like Info-ZIP LICENSE
|
||||
- new generic timelib replacement (currently used by AMIGA port)
|
||||
- more reasonable mapping rules of UNIX "leading-dot" filenames to the
|
||||
DOS 8.3 name convention
|
||||
- repaired screensize detection in MORE paging code
|
||||
(was broken for DOS/OS2/WIN32 in 5.41)
|
||||
|
||||
The 5.41 maintenance release adds another new port and fixes some bugs.
|
||||
|
||||
- new BSD-like LICENSE
|
||||
- new Novell Netware NLM port
|
||||
- supports extraction of archives with more than 64k entries
|
||||
- attribute handling of VMS port was broken in UnZip 5.4
|
||||
- decryption support integrated in the main source distribution
|
||||
|
||||
The 5.4 release adds new ports, again. Other important items are changes
|
||||
to the listing format, new supplemental features and several bug fixes
|
||||
(especially concerning time-stamp handling...):
|
||||
|
||||
- new IBM OS/390 port, a UNIX derivate (POSIX with EBCDIC charset)
|
||||
- complete revision of the MacOS port
|
||||
- changed listing formats to enlarge the file size fields for more digits
|
||||
- added capability to restore directory attributes on MSDOS, OS/2, WIN32
|
||||
- enabled support of symbolic links on BeOS
|
||||
- Unix: optional Acorn filetype support, useful for volumes exported via NFS
|
||||
- several changes/additions to the DLL API
|
||||
- GUI SFX stub for Win16 (Windows 3.1) and Win32 (Windows 9x, Windows NT)
|
||||
- new free GCC compiler environments supported on WIN32
|
||||
- many time-zone handling bug fixes for WIN32, AMIGA, ...
|
||||
|
||||
The 5.32 release adds two new ports and a fix for at least one relatively
|
||||
serious bug:
|
||||
|
||||
- new FlexOS port
|
||||
- new Tandem NSK port
|
||||
- new Visual BASIC support (compatibility with the Windows DLLs)
|
||||
- new -T option (set zipfile timestamp) for virtually all ports
|
||||
- fix for timestamps beyond 2038 (e.g., 2097; crashed under DOS/Win95/NT)
|
||||
- fix for undetected "dangling" symbolic links (i.e., no pointee)
|
||||
- fix for VMS indexed-file extraction problem (stored with Zip 2.0 or 2.1)
|
||||
- further performance optimizations
|
||||
|
||||
The 5.31 release included nothing but small bug-fixes and typo corrections,
|
||||
with the exception of some minor performance tweaks.
|
||||
|
||||
The 5.3 release added still more ports and more cross-platform portability
|
||||
features:
|
||||
|
||||
- new BeOS port
|
||||
- new SMS/QDOS port
|
||||
- new Windows CE graphical port
|
||||
- VM/CMS port fully updated and tested
|
||||
- MVS port fully updated and tested
|
||||
- updated Windows DLL port, with WiZ GUI spun off to a separate package
|
||||
- full Universal Time (UTC or GMT) support for trans-timezone consistency
|
||||
- cross-platform support for 8-bit characters (ISO Latin-1, OEM code pages)
|
||||
- support for NT security descriptors (ACLs)
|
||||
- support for overwriting OS/2 directory EAs if -o option given
|
||||
- updated Solaris/SVR4 package facility
|
||||
|
||||
What is (still!) not added is multi-part archive support (a.k.a. "diskette
|
||||
spanning") and a unified and more powerful DLL interface. These are the
|
||||
two highest priorities for the 6.x releases. Work on the former is almost
|
||||
certain to have commenced by the time you read this. This time we mean it!
|
||||
You betcha. :-)
|
||||
|
||||
Although the DLLs are still basically a mess, the Windows DLLs (16- and 32-
|
||||
bit) now have some documentation and a small example application. Note that
|
||||
they should now be compatible with C/C++, Visual BASIC and Delphi. Weirder
|
||||
languages (FoxBase, etc.) are probably Right Out.
|
||||
|
||||
Finally, note that support for unshrinking has now been turned OFF by default,
|
||||
although the source code is still available (as with unreducing). This was
|
||||
done for legal reasons, not technical ones, and no, we're not any happier
|
||||
about it than you are. :-( See the COPYING file for details.
|
||||
|
||||
|
||||
INTERNET RESOURCES
|
||||
------------------
|
||||
|
||||
Info-ZIP's web site is at http://www.info-zip.org/pub/infozip/
|
||||
and contains the most up-to-date information about coming releases,
|
||||
links to binaries, and common problems.
|
||||
(See http://www.info-zip.org/pub/infozip/FAQ.html for the latter.)
|
||||
Files may also be retrieved via ftp://ftp.info-zip.org/pub/infozip/ .
|
||||
Thanks to LEO (Munich, Germany) for hosting our primary site.
|
||||
|
||||
|
||||
DISTRIBUTION
|
||||
------------
|
||||
If you have a question regarding redistribution of Info-ZIP software, either
|
||||
as is, as packaging for a commercial product, or as an integral part of a
|
||||
commercial product, please read the Frequently Asked Questions (FAQ) section
|
||||
of the included COPYING file.
|
||||
|
||||
Insofar as C compilers are rare on some platforms and the authors only have
|
||||
direct access to a subset of the supported systems, others may wish to pro-
|
||||
vide ready-to-run executables for new systems. In general there is no prob-
|
||||
lem with this; we require only that such distributions include this README
|
||||
file, the WHERE file, the COPYING file (contains copyright/redistribution
|
||||
information), and the appropriate documentation files (unzip.txt and/or
|
||||
unzip.1 for UnZip, etc.). If the local system provides a way to make self-
|
||||
extracting archives in which both the executables and text files can be
|
||||
stored together, that's best (in particular, use UnZipSFX if at all possible,
|
||||
even if it's a few kilobytes bigger than the alternatives); otherwise we
|
||||
suggest a bare UnZip executable and a separate zipfile containing the re-
|
||||
maining text and binary files. If another archiving method is in common
|
||||
use on the target system (for example, Zoo or LHa), that may also be used.
|
||||
|
||||
|
||||
BUGS AND NEW PORTS: CONTACTING INFO-ZIP
|
||||
----------------------------------------
|
||||
All bug reports and patches (context diffs only, please!) should go to
|
||||
Zip-Bugs@lists.wku.edu, which is the e-mail address for the Info-ZIP
|
||||
authors. (Note that a few rare systems require the Zip-Bugs part to be
|
||||
capitalized as shown; most systems work OK with lowercase "zip-bugs,"
|
||||
however.) DO NOT MAIL US LARGE BINARIES--EVER. If you need to send us
|
||||
a problem archive that happens to be large (> 20K), contact us first for
|
||||
instructions.
|
||||
|
||||
"Dumb questions" that aren't adequately answered in the documentation
|
||||
should also be directed to Zip-Bugs rather than to a global forum such
|
||||
as Usenet. (Kindly make certain that your question *isn't* answered by
|
||||
the documentation, however--a great deal of effort has gone into making
|
||||
it clear and complete.)
|
||||
|
||||
Suggestions for new features can be discussed on Info-ZIP@lists.wku.edu,
|
||||
a mailing list for Info-ZIP beta testers and interested parties; you need
|
||||
to subscribe first, however (see below). We make no promises to act on all
|
||||
suggestions or even all patches, but if it is something that is manifestly
|
||||
useful, sending the required patches to Zip-Bugs directly (as per the
|
||||
instructions in the ZipPorts file) is likely to produce a quicker response
|
||||
than asking us to do it--the authors are always ridiculously short on time.
|
||||
(Please do NOT send patches or encoded zipfiles to the Info-ZIP list.
|
||||
Please DO read the ZipPorts file before sending any large patch. It would
|
||||
be difficult to over-emphasize this point...)
|
||||
|
||||
If you are considering a port, not only should you read the ZipPorts file,
|
||||
but also please check in with Zip-Bugs BEFORE getting started, since the
|
||||
code is constantly being updated behind the scenes. (For example, VxWorks,
|
||||
VMOS and Netware ports were once claimed to be under construction, although
|
||||
we have yet to see any up-to-date patches.) We will arrange to send you the
|
||||
latest sources. The alternative is the possibility that your hard work will
|
||||
be tucked away in a subdirectory and mostly ignored, or completely ignored
|
||||
if someone else has already done the port (and you'd be surprised how often
|
||||
this has happened).
|
||||
|
||||
|
||||
BETA TESTING: JOINING INFO-ZIP
|
||||
-------------------------------
|
||||
If you'd like to keep up to date with our UnZip (and companion Zip utility)
|
||||
development, join the ranks of beta testers, add your own thoughts and
|
||||
contributions, or simply lurk, you may join one of our mailing lists.
|
||||
There is an announcements-only list (Info-ZIP-announce) and a general
|
||||
discussion/testing list (Info-ZIP). You must be a subscriber to post, and
|
||||
you can subscribe via the links on our Frequently Asked Questions page:
|
||||
|
||||
http://www.info-zip.org/pub/infozip/FAQ.html#lists
|
||||
|
||||
(Please note that as of late May 2004, the lists are unavailable pending
|
||||
a move to a new site; we hope to have them restored shortly. In the
|
||||
interim ...) Feel free to use our bug-reporting web page for bug reports
|
||||
and to ask questions not answered on the FAQ page above:
|
||||
|
||||
http://www.info-zip.org/zip-bug.html
|
||||
|
||||
There is also a closed mailing list for internal discussions of our core
|
||||
development team. This list is now kept secret to prevent us from being
|
||||
flooded with spam messages.
|
||||
|
||||
|
||||
-- Greg Roelofs (sometimes known as Cave Newt), principal UnZip developer
|
||||
guy, with inspiration from David Kirschbaum, was Author of this text.
|
||||
|
||||
-- Christian Spieler (shorthand: SPC), current UnZip maintenance coordinator,
|
||||
applied the most recent changes.
|
||||
40
win/unzip/README.NT
Normal file
40
win/unzip/README.NT
Normal file
@@ -0,0 +1,40 @@
|
||||
README.NT 27 February 2005
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Contents of the UnZip 5.52 distribution archive for Win9x/NT/2K/XP/2K3 (Intel):
|
||||
|
||||
README general information
|
||||
LICENSE terms and conditions for using Info-Zip code
|
||||
COPYING.OLD additional Copyright notes
|
||||
WHERE where to get the current Info-ZIP software
|
||||
unzip.txt UnZip manual (preformatted unix man page)
|
||||
unzipsfx.txt UnZipSFX manual (dto.)
|
||||
funzip.txt manual for fUnZip
|
||||
zipinfo.txt manual for UnZip's ZipInfo mode
|
||||
ziplimit.txt infos about limitations of Info-Zip's progs
|
||||
README.NT this file ...
|
||||
unzip.exe UnZip for NT command line utility, MSVC++ 6.0
|
||||
unzipsfx.exe console mode SFX stub for NT, MSVC++ 6.0
|
||||
funzip.exe UnZip "filter" utility
|
||||
SFXWiz32.exe GUI mode SFX stub for NT, MSVC++ 6.0
|
||||
unzipsfx-gcc.exe console mode SFX stub for NT, gcc/mingw32
|
||||
SFXWiz32-gcc.exe GUI mode SFX stub for NT, gcc/mingw32
|
||||
|
||||
|
||||
The program executables were compiled with MS Visual C++ 6.0 SP6 (MSC v12.00),
|
||||
using the win32/Makefile as supplied in the UnZip 5.52 source distribution
|
||||
(with support for ASM_CRC enabled). Additionally, the sfx stubs have been
|
||||
compressed by the free exe packer UPX 1.25.
|
||||
|
||||
The alternative unzipsfx-gcc.exe and SFXWiz32-gcc.exe stubs were compiled
|
||||
by gcc 3.2 using the mingw32 environment. These stubs are significantly
|
||||
smaller, but require the presence of the "msvcrt.dll" C runtime DLL.
|
||||
Normally, this should not be a problem, since this dll is supplied as part
|
||||
of the operating system core for Win2k/XP/2K3 and Windows 98/Me. Older Windows
|
||||
systems (Win95/NT4) support this runtime DLL when Internet Explorer 4.0 (or
|
||||
newer) is installed. The dll is not supplied in a Win32s environment, but
|
||||
this should be a minor problem. (For the text-mode stub this is not a
|
||||
problem at all; Win32s cannot be used to run text-mode applications, anyway.)
|
||||
|
||||
--------
|
||||
Christian Spieler
|
||||
258
win/unzip/WHERE
Normal file
258
win/unzip/WHERE
Normal file
@@ -0,0 +1,258 @@
|
||||
__________________________________________________________________________
|
||||
|
||||
This is the Info-ZIP file ``WHERE,'' last updated on 17 February 2005.
|
||||
__________________________________________________________________________
|
||||
|
||||
The latest version of this file can be found online at:
|
||||
|
||||
ftp://ftp.info-zip.org/pub/infozip/doc/WHERE
|
||||
|
||||
Note that some ftp sites may not yet have the latest versions of Zip
|
||||
and UnZip when you read this. The latest versions always appear in
|
||||
ftp://ftp.info-zip.org/pub/infozip/ (and subdirectories thereof) first,
|
||||
except for encryption binaries, which always appear in
|
||||
ftp://ftp.icce.rug.nl/infozip/ (and subdirectories) first.
|
||||
|
||||
IF YOU FIND AN ERROR: please let us know! We don't have time to
|
||||
check each and every site personally (or even collectively), so any
|
||||
number of the sites listed below may have moved or disappeared en-
|
||||
tirely. E-mail to Zip-Bugs@lists.wku.edu and we'll update this file.
|
||||
__________________________________________________________________________
|
||||
|
||||
|
||||
Info-ZIP's home WWW site is listed on Yahoo and is at:
|
||||
|
||||
ftp://ftp.info-zip.org/pub/infozip/Info-ZIP.html (master version)
|
||||
http://ftp.info-zip.org/pub/infozip/ (master version)
|
||||
http://www.info-zip.org/
|
||||
|
||||
Note that the old sites at http://www.cdrom.com/pub/infozip/ and
|
||||
http://www.freesoftware.com/pub/infozip are PERMANENTLY BROKEN. They
|
||||
cannot be updated or removed, apparently.
|
||||
|
||||
The Zip and UnZip pages have links to most known mirror sites carrying our
|
||||
source and/or binary distributions, and they generally are more up-to-date
|
||||
and have better information than what you are reading:
|
||||
|
||||
ftp://ftp.info-zip.org/pub/infozip/Zip.html
|
||||
ftp://ftp.info-zip.org/pub/infozip/UnZip.html
|
||||
|
||||
The related zlib package by Info-ZIP's Jean-loup Gailly and Mark Adler is at:
|
||||
|
||||
http://www.zlib.org/
|
||||
|
||||
Source-code archives for Info-ZIP's portable Zip, UnZip, and related
|
||||
utilities:
|
||||
|
||||
zip231.zip Zip 2.31 (deflation; includes zipnote/zipsplit/zipcloak)
|
||||
zip231.tar.Z ditto, compress'd tar format
|
||||
|
||||
zip11.zip Zip 1.1 (shrinking, implosion; compatible w. PKUNZIP 1.1)
|
||||
zip11.tar.Z ditto, compress'd tar format
|
||||
|
||||
unzip552.zip UnZip 5.52 (all methods[*]; unzip/funzip/unzipsfx/zipgrep)
|
||||
unzip552.tar.gz ditto, gzip'd tar format
|
||||
unzip552.tar.Z ditto, compress'd tar format
|
||||
|
||||
unred552.zip UnZip 5.52 add-on, contains copyrighted unreduce support
|
||||
|
||||
zcrypt29.zip encryption support for Zip 2.3[**]
|
||||
zcrypt10.zip encryption support for Zip 1.1
|
||||
|
||||
MacZip106src.zip contains all the GUI stuff and the project files to build
|
||||
the MacZip main-app. To build MacZip successfully, both
|
||||
the Zip 2.31 and UnZip 5.52 sources are required, too.
|
||||
|
||||
wiz502.zip WiZ 5.02, Windows 9x/NT GUI front-end for Info-ZIP DLLs
|
||||
wiz502+dlls.zip WiZ 5.02, Windows 9x/NT GUI front-end plus DLL sources
|
||||
|
||||
[*] Unreducing is disabled by default, but is available as add-on.
|
||||
As of July 2004, Unisys's LZW patent was expired worldwide, and
|
||||
unshrinking is turned on by default since the release of UnZip 5.52.
|
||||
See UnZip's INSTALL file for details.
|
||||
|
||||
[**] As of January 2000, US export regulations were amended to allow export
|
||||
of free encryption source code from the US. As of June 2002, these
|
||||
regulations were further relaxed to allow export of encryption binaries
|
||||
associated with free encryption source code. The Zip 2.31, UnZip 5.52
|
||||
and Wiz 5.02 archives now include full crypto source code. As of the
|
||||
Zip 2.31 release, all official binaries include encryption support; the
|
||||
former "zcr" archives ceased to exist.
|
||||
(Note that restrictions may still exist in other countries, of course.)
|
||||
|
||||
Executables archives (and related files) for Info-ZIP's software; not all
|
||||
of these will be immediately available due to lack of access to appropriate
|
||||
systems on the part of Info-ZIP members.
|
||||
|
||||
zip231x.zip MSDOS executables and docs
|
||||
zip231x1.zip OS/2 1.x (16-bit) executables and docs
|
||||
zip231x2.zip OS/2 2/3/4.x (32-bit) executables and docs
|
||||
zip231xA.zip Amiga executables and docs
|
||||
zip231xB.zip BeOS executables and docs
|
||||
zip231xC.zip VM/CMS executable and docs
|
||||
zip231xK.zip Tandem NSK executables and docs
|
||||
zip231xM.xmit MVS classic executable
|
||||
zip231xM-docs.zip MVS classic port, docs only
|
||||
zip231dN.zip WinNT/Win9x (Intel) DLL, header files, docs
|
||||
zip231xN.zip WinNT/Win9x (Intel) executables and docs
|
||||
zip231xN-axp.zip WinNT (Alpha AXP) executables and docs
|
||||
zip231xN-mip.zip WinNT (MIPS R4000) executables and docs
|
||||
zip231xN-ppc.zip WinNT (PowerPC) executables and docs
|
||||
zip231xO.zip IBM OS/390 Open Edition binaries and docs
|
||||
zip231xQ.zip SMS/QDOS executables and docs
|
||||
zip231xR.zip Acorn RISC OS executables and docs
|
||||
zip231xT.zip Atari TOS executables and docs
|
||||
zip231-vms-axp-obj.zip
|
||||
VMS (Alpha AXP) object libs, link procedure and docs
|
||||
zip231-vms-axp-exe.zip
|
||||
VMS (Alpha AXP) executables for VMS 6.1 or later and docs
|
||||
zip231-vms-vax-decc-obj.zip
|
||||
VMS (VAX) object libs (new DEC C), link procedure and docs
|
||||
zip231-vms-vax-decc-exe.zip
|
||||
VMS (VAX) executables (DEC C) for VMS 6.1 or later; docs
|
||||
zip231-vms-vax-vaxc-obj.zip
|
||||
VMS (VAX) object libs (old VAX C), link procedure and docs
|
||||
zip231x.hqx Macintosh BinHex'd executables and docs
|
||||
|
||||
unz552x.exe MSDOS self-extracting executable (16-bit unzip, ..., docs)
|
||||
unz552x3.exe MSDOS self-extracting executable (16-, 32-bit unzip, docs)
|
||||
unz552x1.exe OS/2 1.x (16-bit) self-extracting executables and docs
|
||||
unz552x2.exe OS/2 2/3/4.x (32-bit) self-extracting executables and docs
|
||||
unz552d2.zip OS/2 2/3/4.x (32-bit) DLL, header file, demo exe and docs
|
||||
unz552xA.ami Amiga self-extracting executables and docs
|
||||
unz552xA.lha Amiga executables and docs, LHa archive
|
||||
unz552xB.sfx BeOS self-extracting executables and docs
|
||||
unz552xB.tar.gz BeOS executables and docs, gzip'd tar archive
|
||||
unz552xC.mod VM/CMS executable module in "packed" format
|
||||
unz552xC-docs.zip VM/CMS docs, only
|
||||
unz552xF.zip FlexOS executable and docs
|
||||
unz552xK.zip Tandem NSK executable and docs
|
||||
unz552xM.xmit MVS classic executable
|
||||
unz552xM-docs.zip MVS classic port, docs only
|
||||
unz552dN.zip NT4/W2K/XP/2K3/W9x (32-bit Intel) DLL, header files, docs
|
||||
unz552xN.exe NT/2K/XP/2K3/W9x self-extracting i386 executables and docs
|
||||
unz552xN-axp.exe WinNT (Alpha AXP) self-extracting executables and docs
|
||||
unz552xN-mip.exe WinNT (MIPS R4000) self-extracting executables and docs
|
||||
unz552xN-ppc.exe WinNT (PowerPC) self-extracting executables and docs
|
||||
unz552xQ.sfx SMS/QDOS self-extracting executables and docs
|
||||
unz552xO.tar.Z IBM OS/390 Open edition (Unix-like), exes and docs
|
||||
unz552xR.exe Acorn RISC OS self-extracting executables and docs
|
||||
unz552xR.spk Acorn RISC OS Spark'd executables and docs
|
||||
unz552xT.tos Atari TOS self-extracting executables and docs
|
||||
unz552x-vms-axp-obj.bck VMS backup saveset,
|
||||
contains UnZip (Alpha) obj libs, link procedure, docs
|
||||
unz552x-vms-axp-obj.exe VMS (Alpha AXP) SFX archive (statically linked),
|
||||
contains UnZip (Alpha) obj libs, link procedure, docs
|
||||
unz552x-vms-axp-exe.exe VMS (Alpha AXP) SFX archive (dynamically linked),
|
||||
contains UnZip (Alpha AXP, DEC C) executables and docs,
|
||||
smaller than object archive, but requires VMS 6.1
|
||||
unz552x-vms-vax-decc-obj.bck VMS backup saveset,
|
||||
contains UnZip (new DEC C) obj libs, link procedure, docs
|
||||
unz552x-vms-vax-decc-obj.exe VMS (VAX) SFX archive (statically linked),
|
||||
contains UnZip (new DEC C) obj libs, link procedure, docs
|
||||
unz552x-vms-vax-decc-exe.exe VMS (VAX) SFX archive (dynamically linked),
|
||||
contains UnZip (new DEC C) executables and docs,
|
||||
smaller than object archive, but requires VMS 6.1
|
||||
unz552x-vms-vax-vaxc-obj.bck VMS backup saveset,
|
||||
contains UnZip (old VAX C) obj libs, link procedure, docs
|
||||
unz552x-vms-vax-vaxc-obj.exe VMS (VAX) SFX archive (statically linked),
|
||||
contains UnZip (old VAX C) obj libs, link procedure, docs
|
||||
unz552x.hqx Macintosh BinHex'd executables and docs for unzip
|
||||
(unz552x.tar.{Z,gz} Unix exes/docs for Solaris 2.x, SCO Unix, Linux, etc.,
|
||||
depending on directory/location; generally only provided
|
||||
in cases where the OS does *not* ship with a bundled C
|
||||
compiler)
|
||||
|
||||
MacZip106nc.hqx Macintosh combined Zip&UnZip application with GUI,
|
||||
executables and docs (no encryption)
|
||||
MacZip106c.hqx Macintosh combined Zip&UnZip application with GUI,
|
||||
executables and docs (with encryption)
|
||||
|
||||
wiz502xN.exe WiZ 5.02 32-bit (Win9x/NT/2K/XP/2K3) app+docs (self-extr.)
|
||||
|
||||
UnzpHist.zip complete changes-history of UnZip and its precursors
|
||||
ZipHist.zip complete changes-history of Zip
|
||||
|
||||
ftp/web sites for the US-exportable sources and executables:
|
||||
|
||||
NOTE: Look for the Info-ZIP file names given above (not PKWARE or third-
|
||||
party stuff) in the following locations. Some sites like to use slightly
|
||||
different names, such as zip-2.31.tar.gz instead of zip231.tar.Z.
|
||||
|
||||
ftp://ftp.info-zip.org/pub/infozip/ [THE INFO-ZIP HOME SITE]
|
||||
ftp://sunsite.doc.ic.ac.uk/packages/zip/ [MIRRORS THE INFO-ZIP HOME SITE]
|
||||
ftp://unix.hensa.ac.uk/mirrors/uunet/pub/archiving/zip/
|
||||
|
||||
ftp://ftp.cmdl.noaa.gov/aerosol/doc/archiver/{all,dos,os2,mac,vax_alpha}/
|
||||
ftp://garbo.uwasa.fi/pc/arcers/ [AND OTHER GARBO MIRRORS]
|
||||
ftp://garbo.uwasa.fi/unix/arcers/ [AND OTHER GARBO MIRRORS]
|
||||
ftp://ftp.elf.stuba.sk/pub/pc/pack/ [AND OTHER STUBA MIRRORS]
|
||||
ftp://ftp-os2.cdrom.com/pub/os2/archiver/
|
||||
ftp://ftp-os2.nmsu.edu/os2/archiver/
|
||||
ftp://ftp.informatik.tu-muenchen.de/pub/comp/os/os2/archiver/
|
||||
ftp://sumex-aim.stanford.edu/info-mac/cmp/
|
||||
ftp://ftp.wustl.edu/pub/aminet/util/arc/ [AND OTHER AMINET MIRRORS]
|
||||
ftp://atari.archive.umich.edu/pub/Archivers/ [AND OTHER UMICH MIRRORS]
|
||||
http://www.umich.edu/~archive/atari/Archivers/
|
||||
ftp://jake.educom.com.au/pub/infozip/acorn/ [Acorn RISC OS]
|
||||
http://www.sitec.net/maczip/ [MacZip port]
|
||||
|
||||
ftp/web sites for the encryption and decryption sources and/or executables:
|
||||
|
||||
Outside the US:
|
||||
ftp://ftp.info-zip.org/pub/infozip/ [THE INFO-ZIP HOME SITE]
|
||||
ftp://ftp.icce.rug.nl/infozip/ [THE INFO-ZIP ENCRYPTION HOME SITE]
|
||||
ftp://ftp.elf.stuba.sk/pub/pc/pack/
|
||||
ftp://garbo.uwasa.fi/pc/arcers/
|
||||
ftp://ftp.inria.fr/system/arch-compr/
|
||||
ftp://ftp.leo.org/pub/comp/os/os2/leo/archiver/
|
||||
(mail server at ftp-mailer@ftp.leo.org)
|
||||
|
||||
ftp://ftp.win.tue.nl/pub/compression/zip/
|
||||
ftp://ftp.uni-erlangen.de/pub/pc/msdos/arc-utils/zip/
|
||||
|
||||
|
||||
The primary distribution site for the MacZip port can be found at:
|
||||
|
||||
http://www.sitec.net/maczip/
|
||||
|
||||
ftp sites for VMS-format Zip and UnZip packages (sources, object files and
|
||||
executables, no encryption/decryption--see also "Mail servers" section below):
|
||||
|
||||
ftp.spc.edu [192.107.46.27] and ftp.wku.edu:
|
||||
|
||||
[.MACRO32]AAAREADME.TXT
|
||||
[.MACRO32.SAVESETS]UNZIP.BCK or UNZIP.ZIP (if already have older version)
|
||||
[.MACRO32.SAVESETS]ZIP.ZIP
|
||||
|
||||
To find other ftp/web sites:
|
||||
|
||||
The "archie" ftp database utility can be used to find an ftp site near
|
||||
you (although the command-line versions always seem to find old ver-
|
||||
sions...the `FTPsearch' server at http://ftpsearch.ntnu.no/ftpsearch
|
||||
--formerly `Archie 95'--is quite up-to-date, however). Or check a stan-
|
||||
dard WWW search engine like AltaVista (http://www.altavista.digital.com/)
|
||||
or Yahoo (http://www.yahoo.com/). If you don't know how to use these,
|
||||
DON'T ASK US--read the web sites' help pages or check the Usenet groups
|
||||
news.announce.newusers or news.answers or some such, or ask your system
|
||||
administrator.
|
||||
|
||||
Mail servers:
|
||||
|
||||
To get the encryption sources by e-mail, send the following commands
|
||||
to ftp-mailer@informatik.tu-muenchen.de:
|
||||
|
||||
get /pub/comp/os/os2/archiver/zcrypt29.zip
|
||||
quit
|
||||
|
||||
To get the VMS Zip/UnZip package by e-mail, send the following
|
||||
commands in the body of a mail message to fileserv@wku.edu (the
|
||||
"HELP" command is also accepted):
|
||||
|
||||
SEND FILESERV_TOOLS
|
||||
SEND UNZIP
|
||||
SEND ZIP
|
||||
|
||||
To get Atari executables by e-mail, send a message to
|
||||
atari@atari.archive.umich.edu for information about the mail server.
|
||||
__________________________________________________________________________
|
||||
BIN
win/unzip/unzip.exe
Normal file
BIN
win/unzip/unzip.exe
Normal file
Binary file not shown.
Reference in New Issue
Block a user