Compare commits

..

83 Commits
2.3.1 ... 2.3.2

Author SHA1 Message Date
Safihre
3c87fd45c3 Set version to 2.3.2 2017-12-21 20:41:52 +01:00
Safihre
d0a258ce28 Merge branch 'develop' 2017-12-21 20:38:19 +01:00
Safihre
1cac5799eb Update text files for 2.3.2 2017-12-21 20:19:15 +01:00
Safihre
a56e4f3650 Small reduction of the unused encoding functions 2017-12-20 15:07:50 +01:00
Safihre
9970d2ee6f Remove obsolete UNTRANS function
We now use subprocessww, to pass real unicode to new processes on Windows.
2017-12-20 14:10:39 +01:00
Safihre
f2695e9305 Correctly handle unicode/deunicode in pre-queue script 2017-12-20 14:10:13 +01:00
Safihre
d333f1b56b Deunicode should make string of everything 2017-12-20 14:10:13 +01:00
shypike
00f5b29caa Fix CP850-Latin1 mapping, prevent "f" from being converted to 0x9F 2017-12-20 13:46:32 +01:00
Safihre
16aa43c120 Also extract password from job filename
Closes #1084
2017-12-19 22:27:36 +01:00
Safihre
b2179d5b3e Small patch of Categorie Config highlights 2017-12-14 15:36:43 +01:00
Safihre
8e2e9fd5c9 Remove extra logging for missing article DB errors
Closes #952
2017-12-14 10:36:17 +01:00
Safihre
2e3181779a Correct highlighting in Config for each sub-section 2017-12-14 10:19:52 +01:00
Safihre
8a270e49be Add caller name to logging for purging of job data 2017-12-11 15:15:47 +01:00
Safihre
32e26c804b Correctly update row colors when selecting Advanced Settings 2017-12-10 15:35:25 +01:00
Safihre
5cf87be51e Update README typo 2017-12-10 15:35:11 +01:00
SABnzbd Automation
781c45bf3b Automatic translation update 2017-12-09 15:32:43 +00:00
Safihre
df5a85f851 Correctly update text files for 2.3.2RC2
Typo!
2017-12-09 16:23:49 +01:00
Safihre
8373994be6 Add extra logging when folder wasn't removed in purge 2017-12-09 16:20:36 +01:00
Safihre
437ff427f8 Improvements to Advanced Settings switching in Config 2017-12-09 15:16:38 +01:00
Safihre
ea5e4dfee1 If Download all par2 was enabled jobs would get orphaned
Mistake in fd1975617b
Jobs were incorrectly re-added after QC failure because already downloaded par2 files were "added" as new ones, resulting in orphaned jobs because there were no new files.
2017-12-09 14:18:22 +01:00
SABnzbd Automation
2e45f4028c Automatic translation update 2017-12-08 11:17:18 +00:00
Safihre
d7cdce9278 Update text files for 2.3.2RC2 2017-12-08 11:49:33 +01:00
Safihre
38c329ade2 Hide Advanced Settings
Closes #1082
2017-12-08 10:15:18 +01:00
Safihre
933d0c073c If wizard started with already setup servers, select the right one 2017-12-06 16:10:50 +01:00
Safihre
1f49bba343 Make warning about SABnzbd possibly being exposed more prominent 2017-12-06 15:49:12 +01:00
Safihre
0ac712dce1 Add 'Job Name as Folder Name' as Sorting Preset for de-obfuscation
Also rename internal variable `dirname`, since it's really just the job-name.
2017-12-06 10:57:36 +01:00
Safihre
f1ae9060c3 Remove white space before some warnings
Closes #1081
2017-12-04 10:30:09 +01:00
Safihre
263231bb62 Lower upper-bound for auto-detected Article Cache to 1G
2G is a bit too much and should only happen in extreme cases
2017-12-03 20:36:30 +01:00
SABnzbd Automation
a7b964c153 Automatic translation update 2017-12-03 16:42:42 +00:00
Safihre
78035eed12 Wizard server test with existing server would require re-entering pass 2017-12-03 13:47:42 +01:00
Safihre
0e7ac8ec5e Add new %dn to Pattern Key for Date Sorting
Closes #1080
2017-12-03 10:49:38 +01:00
Safihre
00f262c90e Rename tvsort.py to sorting.py for consistency 2017-12-03 10:44:20 +01:00
Safihre
68df476603 Rename Generic Sorter to Movie Sorter to match interface name 2017-12-03 10:38:48 +01:00
Safihre
5da03f506d Replace ".avi" by ".mkv" in examples for Sorting 2017-12-03 10:34:40 +01:00
Safihre
0c9540e41e Add %dn to DateSorter 2017-12-03 10:29:59 +01:00
Safihre
c6226c6adb Add per-day download-stats to server_stats API-call
Linked #1079
2017-12-01 19:03:52 +01:00
Safihre
b8aab5c0f8 Lower bound for auto-detected article cache set to 32M again
For systems with 256MB or 512MB memory the auto-detected values are valid (e.g. 64MB and 128MB) and would otherwise be discarded.
2017-12-01 00:22:51 +01:00
Safihre
e29e7a65b5 Limit auto-detected article cache to 2GB
Users can set more if they want, or if they are on 32bit system it will be limited automatically to 1GB.
2017-11-30 23:59:44 +01:00
Safihre
eb46ed80b6 Also use 1/4th of memory on macOS for Article Cache 2017-11-30 23:45:32 +01:00
Safihre
50b2d558eb Also use 1/4th of memory on Windows for Article Cache 2017-11-30 23:45:20 +01:00
Fish2
3b4b3dcca2 Add moment.js Language he.js - Hebrew 2017-11-27 20:54:16 +01:00
Fish2
e0f8410918 Remove Unused Language Files 2017-11-27 20:54:16 +01:00
Fish2
581942ca11 Update bootstrap3-typeahead.js to V4.0.2, Update jQuery Form Plugin To 4.2.2, Update jquery-qrcode To v0.14.0 2017-11-27 20:54:16 +01:00
Fish2
005fd399d0 Update Glitter moment.js to 2.19.2 2017-11-27 20:54:16 +01:00
Fish2
6ff00bc992 Update Six to 1.11.0 2017-11-27 20:54:16 +01:00
Safihre
ca66eb04ad Note restoring of OSX 10.11.6 compatibility for 2.3.2RC1
Closes #1075
2017-11-26 11:07:24 +01:00
Safihre
91a2532c95 Show warning in wizard when language files are not present
Closes #1074
2017-11-25 10:51:31 +01:00
SABnzbd Automation
cb49f7bb53 Automatic translation update 2017-11-23 17:12:04 +00:00
Safihre
0049f14d7f Update text files for 2.3.2RC1 2017-11-23 17:31:22 +01:00
Safihre
e414874910 Only report missing UnZip when missing 7Zip 2017-11-23 13:39:04 +01:00
Safihre
5931beaa5c Quote all arguments to external processes on Windows 2017-11-23 13:36:47 +01:00
Safihre
b3d80b7c65 Remove unzip from Windows distribution 2017-11-20 20:24:01 +01:00
shypike
9aa90083b2 When available, use 7zip instead of built-in unzip.
7zip supports passwords, many old platform unzips do not.
2017-11-20 20:24:01 +01:00
Safihre
0b939a9519 Notification category Default only means "all categories" if non other 2017-11-20 20:08:32 +01:00
Safihre
501867137a Reset also article try-list on dropped server connections
Test release for these users showed that "server dropped connection" also needed a reset of the article trylist.
Linked:
https://forums.sabnzbd.org/viewtopic.php?f=2&t=23111
https://forums.sabnzbd.org/viewtopic.php?f=2&t=23109
2017-11-20 12:06:56 +01:00
Safihre
75d4b5deca Add tooltip to server graph month selector 2017-11-19 15:02:17 +01:00
Safihre
442591f20c Link server graphs (month and scale) and show monthly total
Closes #1028
2017-11-19 14:58:43 +01:00
Safihre
74b7f383db Always show 1 decimal for MB and above
So it is similar to the JS filesize function
2017-11-19 14:55:46 +01:00
Safihre
b966707247 Implement fast and slow queue in postprocessor
So I implemented this in a kind of cheeky easy way: 
There is a fast and a slow queue in the `PostProcessor`, if we see it has completed Direct Unpack or if it is still active (might be unpacking that last volume) it is put in the fast queue.
We always check the fast queue first, then the slow one. To not have slow jobs be stuck in the post-proc queue forever, every 3 fast jobs we force a slow job (if present).
Closes #1014
2017-11-18 19:00:52 +01:00
Safihre
eada7286d1 Small optimization in registering of article for first articles 2017-11-18 16:31:47 +01:00
Safihre
b9c312961b listdir can fail on Windows for C: instead of C:\ and crashing postproc 2017-11-18 09:55:56 +01:00
Safihre
8389b4fedb Re-evaluate filenames after first par2 file is finished
Just in case it came in after all first articles were downloaded.
2017-11-18 00:57:15 +01:00
Safihre
7720cd60ec Decode first articles of each file first to find filenames
Get first article of each file first, so that we can use the par2 information to get the filename. This way on obfuscated posts we can faster start Direct Unpack.
In a bit convoluted way so that we can also stay performance tuned.
Closes #1044
2017-11-18 00:45:40 +01:00
Safihre
d1d437074a Do not flush article cache to disk on pause
Overly cautious
2017-11-18 00:13:50 +01:00
Safihre
30d3d62e09 Correct MultiPar Extra Par2 Option passing 2017-11-17 22:29:15 +01:00
Safihre
fd1975617b Simplify and comment code on par2 errors
Closes #1070 (read for details)
2017-11-17 22:24:55 +01:00
SABnzbd Automation
1d037dcb62 Automatic translation update 2017-11-16 22:12:35 +00:00
Safihre
bd5fb3e88f Remove unused crash_msg postproc code 2017-11-16 22:21:39 +01:00
Safihre
5ca66bfeef Only require SABYenc to match minor version and bump to 3.3.2 2017-11-16 20:27:32 +01:00
Safihre
c9fbadd097 Improve progressbar on new Firefox 2017-11-15 15:33:44 +02:00
Safihre
f4568ad7dd Do not warn about disk-errors when job is deleted/done
Only happens in really fast situations with many server connections for small downloads completed within 1 or 2 seconds.
2017-11-15 13:02:01 +02:00
Safihre
74a395f584 Increase wait-time in URLGrabber and stop after 10 tries
Closes #1069
2017-11-13 18:10:18 +02:00
Safihre
dd703ace7f Fully parse output of Pre-Q script correctly
PP/Priority are different, since 0 is also a valid value for these settings.
2017-11-12 14:19:10 +02:00
Safihre
ddc8396260 Empty values in Pre-Q script should not just be ignored 2017-11-12 13:07:41 +02:00
Safihre
e6724e347c Do not 'fix' sending of priority and pp-setting, removes the 0 setting
Priority Normal and PP-setting Download have a value of 0, so they were not send to the pre-Q script.
2017-11-11 17:26:14 +02:00
Safihre
7fa0508ae8 Show tooltip to explain 'Show Logging' anonymized the data 2017-11-11 17:03:53 +02:00
Safihre
06c6f7d38e Auto-history-purge on start-up
Closes #1065
2017-11-11 16:46:11 +02:00
Safihre
59ef400fec Log history-status of failure during repair
For easier debugging
2017-11-11 16:40:04 +02:00
Safihre
0acdf15755 Always show user-entered password in History-info
People like to have this info, some users want to only unpack later etc.
2017-11-11 16:31:38 +02:00
SABnzbd Automation
40128f59dd Automatic translation update 2017-11-07 13:33:01 +00:00
Safihre
286914f253 Correctly report when repair is performed, but fails
Strange, but it can happen. There has been an uptick in this kind of failing downloads. Seems to be a problem with the original par2-files, but not sure yet what it is.
 https://forums.sabnzbd.org/viewtopic.php?f=2&t=23048&p=114059
2017-11-06 13:02:23 +01:00
Fish2
f9bd58bb74 lossless compression of images 2017-11-04 11:47:21 +01:00
Safihre
30cfb9c6fc Prevent potential pause/unpause loop after tray click 2017-10-27 23:39:01 +02:00
83 changed files with 1916 additions and 1922 deletions

View File

@@ -1,7 +1,7 @@
Metadata-Version: 1.0
Name: SABnzbd
Version: 2.3.1
Summary: SABnzbd-2.3.1
Version: 2.3.2
Summary: SABnzbd-2.3.2
Home-page: https://sabnzbd.org
Author: The SABnzbd Team
Author-email: team@sabnzbd.org

View File

@@ -1,48 +1,37 @@
Release Notes - SABnzbd 2.3.1
Release Notes - SABnzbd 2.3.2
=========================================================
## Changes since 2.3.0
- Added post-processing script Deobfuscate.py (in "scripts" folder)
which can automatically process "rename.par2" after unpacking
or rename the largest file in the folder to the job's name
- Maximum Article Cache size increased to 4GB on 64 bit systems
- New servers will have timeout of 60 seconds instead of 120
- Last output of a running script is shown in history
- Paths to par2, unrar, unzip and 7zip are passed to scripts
- Path to gzipped NZB file of job is passed to scripts
- Windows: Single click on tray icon pauses/unpauses queue
## 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
- Article Cache is automatically set to 25% of system memory, if no
custom value was set. Maximum set by auto-detect is 1GB
- Simplify Config pages by hiding Advanced Settings
- Added option '%dn' to Date Sorting to rename files as job name
- Added 'Job Name as Folder Name' as Sorting Preset for de-obfuscation
- Server usage graphs are now linked to make comparing servers easier
- URLs that fail to fetch due to server errors will only be retried 10x
- Delay between URL retries increases when not specified by server
- First article of each file is downloaded first to identify filenames
- Jobs finished by Direct Unpack will be post-processed first
- If available, 7zip will be used instead of unzip
- Job password entered by user is always shown in History
- Password is also extracted from filename in case of custom job name
- Add per-day download-statistics to 'server_stats' API-call
- Added Hebrew date-time texts
## Bugfixes since 2.3.0
- Abort Direct Unpack if not progressing 2 minutes after download
- Direct Unpacker could crash on some downloads
- Added measures to prevent "Failed to import" errors
- Downloader could crash during first few seconds after start
- Saving errors of renames-file prevented
- More verbose logging of creating and deleting files
- Remove ".par2" at end of job name, could cause failure of repair
- Fix racing-condition for files coming in after a job finishes
- When re-adding a job, the time left was not calculated
- Priority of category was ignored when adding new job
- Server information in Status window was not always updated
- Always show Direct Unpack status on smaller screens
- Correctly adapt date and time display to local time zone
- Category folders cannot be sub-folders of Temporary Download Folder
- Email notifications could not be limited to categories
- Testing email notifications did not work
- Added "with" to list of lowercase words in titles for Sorting
- "From SxxEyy" RSS filter did not always work
- Show clearly that RSS "From Show SxxEyy" is an "Accept"-type filter
- Sorting failed when "Ignore folders inside archives" was enabled
- Always send "failure_url" to post-processing scripts
- Decoding of articles no longer logged by default to reduce logging
- Windows: Remove incompatible "Extra Par2 Parameters" for MultiPar
- Windows: Special filenames could cause failures during unpack
- Windows: Message box is shown in case of fatal startup error
- Windows: Unpacking to network shares could fail
- macOS: Added Safari pinned tab icon
In case of "Article DB missing/empty" errors, enable +Debug logging
and report here: https://github.com/sabnzbd/sabnzbd/issues/952
## Bugfixes since 2.3.1
- Dropped connections could result in stalled downloads
- Pre-queue scripts would fail to run
- Pre-queue script output was not always parsed correctly
- Notifications were always sent for 'Default' category
- 'History Retention' also checked on start of program
- macOS: Restore full compatibility with macOS 10.11
- Windows: Unpacking could fail due to paths not being quoted
- Windows: All input parameters to scripts are now 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
## Upgrading from 2.2.x and older
- Finish queue

View File

@@ -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.constants.SABYENC_VERSION_REQUIRED)
logging.info("SABYenc module (v%s)... found!", sabnzbd.decoder.SABYENC_VERSION)
else:
# Something wrong with SABYenc, so let's determine and print what:
if sabnzbd.decoder.SABYENC_VERSION:

View File

@@ -81,7 +81,7 @@
</td>
</tr>
<!--#end if#-->
<!--#if not $have_unzip #-->
<!--#if not $have_unzip and not $have_7zip #-->
<tr>
<th scope="row">$T('opt-enable_unzip'):</th>
<td>

View File

@@ -3,6 +3,11 @@
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
<div class="padding alt section">
<label for="advanced-settings-button" class="form-control advanced-button ">
<input type="checkbox" id="advanced-settings-button" name="advanced-settings-button"> $T('button-advanced')
</label>
</div>
<form action="saveDirectories" method="post" name="fullform" class="fullform" autocomplete="off">
<input type="hidden" id="session" name="session" value="$session" />
<input type="hidden" id="ajax" name="ajax" value="1" />
@@ -21,7 +26,7 @@
<input type="text" name="download_dir" id="download_dir" value="$download_dir" data-initialdir="$my_home" />
<span class="desc">$T('explain-download_dir')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="download_free">$T('opt-download_free')</label>
<input type="text" name="download_free" id="download_free" value="$download_free" class="smaller_input" />
<span class="desc">$T('explain-download_free')</span>
@@ -32,7 +37,7 @@
<span class="desc">$T('explain-complete_dir')</span>
</div>
<!--#if not $nt#-->
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="permissions">$T('opt-permissions')</label>
<input type="text" name="permissions" id="permissions" value="$permissions" class="smaller_input" />
<span class="desc">$T('explain-permissions')</span>
@@ -43,7 +48,7 @@
<input type="text" name="dirscan_dir" id="dirscan_dir" value="$dirscan_dir" data-initialdir="$my_home" />
<span class="desc">$T('explain-dirscan_dir')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="dirscan_speed">$T('opt-dirscan_speed')</label>
<input type="number" name="dirscan_speed" id="dirscan_speed" value="$dirscan_speed" min="0" max="3600" />
<span class="desc">$T('explain-dirscan_speed')</span>
@@ -53,12 +58,12 @@
<input type="text" name="script_dir" id="script_dir" value="$script_dir" data-initialdir="$my_home" />
<span class="desc">$T('explain-script_dir')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="email_dir">$T('opt-email_dir')</label>
<input type="text" name="email_dir" id="email_dir" value="$email_dir" data-initialdir="$my_home" />
<span class="desc">$T('explain-email_dir')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="password_file">$T('opt-password_file')</label>
<input type="text" name="password_file" id="password_file" value="$password_file" />
<span class="desc">$T('explain-password_file')</span>
@@ -72,7 +77,7 @@
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="section">
<div class="section advanced-settings">
<div class="col2">
<h3>$T('systemFolders') <a href="$helpuri$help_uri#toc1" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
<p>$T('explain-folderConfig')</p>

View File

@@ -3,6 +3,11 @@
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
<div class="padding alt section">
<label for="advanced-settings-button" class="form-control advanced-button ">
<input type="checkbox" id="advanced-settings-button" name="advanced-settings-button"> $T('button-advanced')
</label>
</div>
<form action="saveGeneral" method="post" name="fullform" class="fullform" autocomplete="off">
<input type="hidden" id="session" name="session" value="$session" />
<input type="hidden" id="ajax" name="ajax" value=1 />
@@ -28,7 +33,7 @@
<input type="checkbox" name="enable_https" id="enable_https" value="1" <!--#if int($enable_https) > 0 then 'checked="checked" data-original="1"' else ""#-->/>
<span class="desc">$T('explain-enable_https')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="web_dir">$T('opt-web_dir')</label>
<select name="web_dir" id="web_dir">
<!--#for $webline in $web_list#-->
@@ -89,7 +94,6 @@
<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 sabnzbd_restart"><span class="glyphicon glyphicon-refresh"></span> $T('button-restart') SABnzbd</button>
<button class="btn btn-default advancedButton enable_https_options"><span class="glyphicon glyphicon-cog"></span> $T('button-advanced')</button>
</div>
</fieldset>
</div>
@@ -173,7 +177,7 @@
</select>
<span class="desc">$T('explain-check_new_rel')</span>
</div>
<div class="field-pair <!--#if int($have_ssl_context) == 0 then "disabled" else ""#-->">
<div class="field-pair advanced-settings <!--#if int($have_ssl_context) == 0 then "disabled" else ""#-->">
<label class="config" for="enable_https_verification">$T('opt-enable_https_verification')</label>
<input type="checkbox" name="enable_https_verification" id="enable_https_verification" value="1" <!--#if int($enable_https_verification) > 0 then 'checked="checked"' else ""#--> <!--#if int($have_ssl_context) == 0 then "disabled=\"disabled\"" else ""#--> />
<span class="desc">$T('explain-enable_https_verification')</span>
@@ -200,12 +204,12 @@
</select>
<input type="hidden" name="bandwidth_max" id="bandwidth_max" value="$bandwidth_max" />
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="bandwidth_perc">$T('opt-bandwidth_perc')</label>
<input type="number" name="bandwidth_perc" id="bandwidth_perc" value="$bandwidth_perc" step="10" min="0" max="100"/>
<span class="desc">$T('explain-bandwidth_perc')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="cache_limit">$T('opt-cache_limitstr')</label>
<input type="text" name="cache_limit" id="cache_limit" value="$cache_limit" class="smaller_input" />
<span class="desc">$T('explain-cache_limitstr').replace("64M", "256M").replace("128M", "512M")</span>

View File

@@ -91,7 +91,7 @@
<input type="text" name="email_pwd" id="email_pwd" value="$email_pwd" />
<span class="desc">$T('explain-email_pwd')</span>
</div>
<div class="field-pair">
<div class="field-pair no-field-pair-bg">
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
<button class="btn btn-default" type="button" id="test_email" rel="$T('askTestEmail')"><span class="glyphicon glyphicon-envelope"></span> $T('link-testEmail')</button>
</div>
@@ -115,7 +115,7 @@
<div class="col1" <!--#if int($ncenter_enable) > 0 then '' else 'style="display:none"'#-->>
<fieldset>
$show_notify_checkboxes('ncenter')
<div class="field-pair">
<div class="field-pair no-field-pair-bg">
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
<button class="btn btn-default" type="button" id="test_notif"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
</div>
@@ -141,7 +141,7 @@
<div class="col1" <!--#if int($acenter_enable) > 0 then '' else 'style="display:none"'#-->>
<fieldset>
$show_notify_checkboxes('acenter')
<div class="field-pair">
<div class="field-pair no-field-pair-bg">
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
<button class="btn btn-default" type="button" id="test_windows"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
</div>
@@ -167,7 +167,7 @@
<div class="col1" <!--#if int($ntfosd_enable) > 0 then '' else 'style="display:none"'#-->>
<fieldset>
$show_notify_checkboxes('ntfosd')
<div class="field-pair">
<div class="field-pair no-field-pair-bg">
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
<button class="btn btn-default" type="button" id="test_osd"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
</div>
@@ -207,7 +207,7 @@
<span class="desc">$T('Optional') - $T('explain-nscript_parameters')</span>
</div>
$show_notify_checkboxes('nscript')
<div class="field-pair">
<div class="field-pair no-field-pair-bg">
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
<button class="btn btn-default" type="button" id="test_nscript"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
</div>
@@ -241,7 +241,7 @@
<span class="desc">$T('explain-growl_password')</span>
</div>
$show_notify_checkboxes('growl')
<div class="field-pair">
<div class="field-pair no-field-pair-bg">
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
<button class="btn btn-default" type="button" id="test_growl"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
</div>
@@ -286,7 +286,7 @@
</select>
</div>
<!--#end for#-->
<div class="field-pair">
<div class="field-pair no-field-pair-bg">
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
<button class="btn btn-default" type="button" id="test_prowl"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
</div>
@@ -352,7 +352,7 @@
</select>
</div>
<!--#end for#-->
<div class="field-pair">
<div class="field-pair no-field-pair-bg">
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
<button class="btn btn-default" type="button" id="test_pushover"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
</div>
@@ -389,7 +389,7 @@
</div>
<!--#end if#-->
$show_notify_checkboxes('pushbullet')
<div class="field-pair">
<div class="field-pair no-field-pair-bg">
<button class="btn btn-default saveButton"><span class="glyphicon glyphicon-ok"></span> $T('button-saveChanges')</button>
<button class="btn btn-default" type="button" id="test_pushbullet"><span class="glyphicon glyphicon-comment"></span> $T('testNotify')</button>
</div>
@@ -417,6 +417,7 @@
\$(this).parents('.col2').find('.col2-cats').hide()
}
\$('form').submit()
addRowColor()
})
\$('#email_endjob').change(function() {
if(\$(this).val() > 0) {

View File

@@ -2,107 +2,298 @@
<!--#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>
<div class="padding alt section">
<button type="button" class="btn btn-default" id="addServerButton"><span class="glyphicon glyphicon-plus"></span> $T('button-addServer')</button>
<label for="advanced-settings-button" class="form-control advanced-button ">
<input type="checkbox" id="advanced-settings-button" name="advanced-settings-button"> $T('button-advanced')
</label>
<!--#if $months_recorded#-->
<div class="advanced-buttonSeperator"></div>
<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#-->
</select>
</div>
<!--#end if#-->
</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>
<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>
<form action="addServer" method="post" autocomplete="off" onsubmit="removeObfuscation();">
<input type="hidden" name="session" value="$session" />
<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 no-field-pair-bg">
<button class="btn btn-default"><span class="glyphicon glyphicon-plus"></span> $T('button-addServer')</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>
</form>
</div>
</div>
<!--#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>
<div class="field-pair">
<label class="config" for="host">$T('srv-host')</label>
<input type="text" name="host" id="host" required />
<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 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="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 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>
<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><!-- /col1 -->
</div><!-- /section -->
</form>
</div>
</form>
<!--#end for#-->
</div>
<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">
// Define variables needed for the server-plots
var serverData = {}
// Standardize chart options
var chartOptions = {
fullWidth: true,
showArea: true,
@@ -125,246 +316,76 @@
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
-->
<!--#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">
<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']" 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>
<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) {
function showCharts() {
// This month
var theMonth = \$('#chart-selector').val()
var thisDay = new Date()
// What month are we doing?
var inputDate = new Date(month+'-01')
var inputDate = new Date(theMonth+'-01')
var baseDate = new Date(inputDate.getUTCFullYear(), inputDate.getUTCMonth(), 1)
var maxDaysInMonth = new Date(baseDate.getFullYear(), baseDate.getMonth()+1, 0).getDate()
// 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)
// 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)
}
}
// Get formatted date
baseDate.setDate(i)
var dateCheck = toFormattedDate(baseDate)
// Update the text value
\$('#server-data-label-' + server_id).text(\$('#chart-selector :selected').text())
\$('#server-data-value-' + server_id).text(filesize(totalThisMonth, {round: 1}))
// 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 = filesize(elmn.innerHTML, {round: 1}).replace(' ','')
})
});
})
// 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!
@@ -389,14 +410,17 @@
/**
Update charts when changed
**/
\$('.chart-selector').on('change', function(elemn) {
showChart(\$(elemn.target).data('id'), \$(elemn.target).val())
\$('#chart-selector').on('change', function(elemn) {
showCharts()
// 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
@@ -412,11 +436,14 @@
} else {
\$(this).html(\$(this).html().replace("$T('hideDetails')", "$T('showDetails')"));
}
// Add coloring
addRowColor()
});
\$('#addServerButton').click(function(){
\$('#addServer').hide();
\$('#addServerContent').show();
// Add coloring
addRowColor()
});
\$('[name="ssl"]').click(function() {

View File

@@ -40,6 +40,8 @@
<br/>
<input type="button" class="btn btn-default" onclick="tvSet('%sn/%sx%0e - %en/%sn - %sx%0e - %en.%ext')" value="$T('button-Ep1x05')" />
<input type="button" class="btn btn-default" onclick="tvSet('%sn/S%0sE%0e - %en/%sn - S%0sE%0e - %en.%ext')" value="$T('button-EpS01E05')" />
<br>
<input type="button" class="btn btn-default" onclick="tvSet('%dn.%ext')" value="$T('button-FileLikeFolder')" />
</div>
</div>
<div id="previewtv" class="example">
@@ -51,7 +53,7 @@
<label class="config">$T('sortResult')</label> <span class="desc path" id="previewtv-result">&nbsp;</span>
</div>
</div>
<div class="field-pair">
<div class="field-pair no-field-pair-bg">
<label class="config">$T('sort-legenda')</label>
<button type="button" class="btn btn-default patternKey" onclick="jQuery(this).hide(); jQuery('#Key1').show();"><span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span> $T('sort-legenda')</button>
<table id="Key1" class="Key">
@@ -139,9 +141,9 @@
<td>$T("sort-File")</td>
</tr>
<tr>
<td class="align-right"><b>$T('orgDirname'):</b></td>
<td class="align-right"><b>$T('orgJobname'):</b></td>
<td>%dn</td>
<td>$T("sort-Folder")</td>
<td></td>
</tr>
<tr>
<td class="align-right"><b>$T('lowercase'):</b></td>
@@ -199,6 +201,7 @@
<input type="button" class="btn btn-default" onclick="movieSet('%title (%y)/%title (%y).%ext',' CD%1');movieExtraFolder(false)" value="$T('button-inFolders')" />
<input type="button" class="btn btn-default" onclick="movieSet('%title (%y).%ext',' CD%1');movieExtraFolder(true)" value="$T('button-noFolders')" />
<input type="button" class="btn btn-default" onclick="movieSet('%0decade/%title (%y).%ext',' CD%1');movieExtraFolder(true)" value="$T('decade')" />
<input type="button" class="btn btn-default" onclick="movieSet('%dn.%ext')" value="$T('button-FileLikeFolder')" />
</div>
</div>
<div id="previewmovie" class="example">
@@ -210,7 +213,7 @@
<label class="config">$T('sortResult')</label> <span class="desc path" id="previewmovie-result">&nbsp;</span>
</div>
</div>
<div class="field-pair">
<div class="field-pair no-field-pair-bg">
<label class="config">$T('sort-legenda')</label>
<button type="button" class="btn btn-default patternKey" onclick="jQuery(this).hide(); jQuery('#Key2').show();"><span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span> $T('sort-legenda')</button>
<table id="Key2" class="Key">
@@ -263,9 +266,9 @@
<td>$T('sort-File')</td>
</tr>
<tr>
<td class="align-right"><b>$T('orgDirname'):</b></td>
<td class="align-right"><b>$T('orgJobname'):</b></td>
<td>%dn</td>
<td>$T("sort-Folder")</td>
<td></td>
</tr>
<tr>
<td class="align-right"><b>$T('lowercase'):</b></td>
@@ -328,7 +331,9 @@
<div class="presets float-left">
<input type="button" class="btn btn-default" onclick="dateSet('%t/%t - %y-%0m-%0d - %desc.%ext')" value="$T('button-ShowNameF')" />
<input type="button" class="btn btn-default" onclick="dateSet('%y-%0m/%t - %y-%0m-%0d - %desc.%ext')" value="$T('button-YMF')" />
<br>
<input type="button" class="btn btn-default" onclick="dateSet('%y-%0m-%0d/%t - %y-%0m-%0d - %desc.%ext')" value="$T('button-DailyF')" />
<input type="button" class="btn btn-default" onclick="dateSet('%dn.%ext')" value="$T('button-FileLikeFolder')" />
</div>
</div>
<div id="previewdate" class="example">
@@ -340,7 +345,7 @@
<label class="config">$T('sortResult')</label> <span class="desc path" id="previewdate-result">&nbsp;</span>
</div>
</div>
<div class="field-pair">
<div class="field-pair no-field-pair-bg">
<label class="config">$T('sort-legenda')</label>
<button type="button" class="btn btn-default patternKey" onclick="jQuery(this).hide(); jQuery('#Key3').show();"><span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span> $T('sort-legenda')</button>
<table id="Key3" class="Key">
@@ -407,6 +412,11 @@
<td>%fn</td>
<td>$T('sort-File')</td>
</tr>
<tr>
<td class="align-right"><b>$T('orgJobname'):</b></td>
<td>%dn</td>
<td></td>
</tr>
<tr>
<td class="align-right"><b>$T('lowercase'):</b></td>
<td>{$T('TEXT')}</td>
@@ -487,7 +497,7 @@
\$.ajax({
type: "GET",
url: "../../tapi",
data: {mode:'eval_sort', value: 'generic', name: \$('#moviesamplename').val(), title: \$moviesortstring, movieextra: \$('#movieextra').val(), apikey: '$session', output: 'json' },
data: {mode:'eval_sort', value: 'movie', name: \$('#moviesamplename').val(), title: \$moviesortstring, movieextra: \$('#movieextra').val(), apikey: '$session', output: 'json' },
success: function(data){
\$('#previewmovie-result').removeClass("loading failure").html(data.result);
},

View File

@@ -3,9 +3,14 @@
<!--#include $webdir + "/_inc_header_uc.tmpl"#-->
<div class="colmask">
<div class="padding alt section">
<label for="advanced-settings-button" class="form-control advanced-button ">
<input type="checkbox" id="advanced-settings-button" name="advanced-settings-button"> $T('button-advanced')
</label>
</div>
<form action="saveSwitches" method="post" name="fullform" class="fullform" autocomplete="off">
<input type="hidden" id="session" name="session" value="$session" />
<div class="section">
<div class="section advanced-settings">
<div class="col2">
<h3>$T('swtag-server') <a href="$helpuri$help_uri#toc1" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
</div><!-- /col2 -->
@@ -67,12 +72,12 @@
<input type="number" name="propagation_delay" id="propagation_delay" value="$propagation_delay" /> <i>$T('minutes')</i>
<span class="desc">$T('explain-propagation_delay')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="top_only">$T('opt-top_only')</label>
<input type="checkbox" name="top_only" id="top_only" value="1" <!--#if int($top_only) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-top_only')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="pre_check">$T('opt-pre_check')</label>
<input type="checkbox" name="pre_check" id="pre_check" value="1" <!--#if int($pre_check) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-pre_check')</span>
@@ -104,7 +109,7 @@
</select>
<span class="desc">$T('explain-no_series_dupes')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="series_propercheck">$T('opt-series_propercheck')</label>
<input type="checkbox" name="series_propercheck" id="series_propercheck" value="1" <!--#if int($series_propercheck) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-series_propercheck')</span>
@@ -118,6 +123,11 @@
</select>
<span class="desc">$T('explain-pause_on_pwrar')</span>
</div>
<div class="field-pair">
<label class="config" for="unwanted_extensions">$T('opt-unwanted_extensions')</label>
<input type="text" name="unwanted_extensions" id="unwanted_extensions" value="$unwanted_extensions"/>
<span class="desc">$T('explain-unwanted_extensions')</span>
</div>
<div class="field-pair">
<label class="config" for="action_on_unwanted_extensions">$T('opt-action_on_unwanted_extensions')</label>
<select name="action_on_unwanted_extensions" id="action_on_unwanted_extensions">
@@ -127,12 +137,7 @@
</select>
<span class="desc">$T('explain-action_on_unwanted_extensions')</span>
</div>
<div class="field-pair">
<label class="config" for="unwanted_extensions">$T('opt-unwanted_extensions')</label>
<input type="text" name="unwanted_extensions" id="unwanted_extensions" value="$unwanted_extensions"/>
<span class="desc">$T('explain-unwanted_extensions')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="auto_sort">$T('opt-auto_sort')</label>
<input type="checkbox" name="auto_sort" id="auto_sort" value="1" <!--#if int($auto_sort) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-auto_sort')</span>
@@ -160,53 +165,53 @@
<input type="checkbox" name="pause_on_post_processing" id="pause_on_post_processing" value="1" <!--#if int($pause_on_post_processing) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-pause_on_post_processing')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="enable_all_par">$T('opt-enable_all_par')</label>
<input type="checkbox" name="enable_all_par" id="enable_all_par" value="1" <!--#if int($enable_all_par) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-enable_all_par').replace('. ', '.<br/>')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="par_option">$T('opt-par_option')</label>
<input type="text" name="par_option" id="par_option" value="$par_option" />
<span class="desc">$T('explain-par_option')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="sfv_check">$T('opt-sfv_check')</label>
<input type="checkbox" name="sfv_check" id="sfv_check" value="1" <!--#if int($sfv_check) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-sfv_check')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="safe_postproc">$T('opt-safe_postproc')</label>
<input type="checkbox" name="safe_postproc" id="safe_postproc" value="1" <!--#if int($safe_postproc) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-safe_postproc')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="enable_recursive">$T('opt-enable_recursive')</label>
<input type="checkbox" name="enable_recursive" id="enable_recursive" value="1" <!--#if int($enable_recursive) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-enable_recursive')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="flat_unpack">$T('opt-flat_unpack')</label>
<input type="checkbox" name="flat_unpack" id="flat_unpack" value="1" <!--#if int($flat_unpack) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-flat_unpack')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="script_can_fail">$T('opt-script_can_fail')</label>
<input type="checkbox" name="script_can_fail" id="script_can_fail" value="1" <!--#if int($script_can_fail) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-script_can_fail')</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="new_nzb_on_failure">$T('opt-new_nzb_on_failure')</label>
<input type="checkbox" name="new_nzb_on_failure" id="new_nzb_on_failure" value="1" <!--#if int($new_nzb_on_failure) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-new_nzb_on_failure')</span>
</div>
<!--#if not $nt#-->
<div class="field-pair <!--#if not $have_nice then "disabled" else "" #-->">
<div class="field-pair advanced-settings <!--#if not $have_nice then "disabled" else "" #-->">
<label class="config" for="nice">$T('opt-nice')</label>
<input type="text" name="nice" id="nice" value="$nice" <!--#if not $have_nice then 'readonly="readonly" disabled="disabled"' else "" #--> />
<span class="desc">$T('explain-nice')</span>
</div>
<div class="field-pair <!--#if not $have_ionice then "disabled" else "" #-->">
<div class="field-pair advanced-settings <!--#if not $have_ionice then "disabled" else "" #-->">
<label class="config" for="ionice">$T('opt-ionice')</label>
<input type="text" name="ionice" id="ionice" value="$ionice" <!--#if not $have_ionice then 'readonly="readonly" disabled="disabled"' else "" #--> />
<span class="desc">$T('explain-ionice')</span>
@@ -217,7 +222,7 @@
<input type="checkbox" name="ignore_samples" id="ignore_samples" value="1" <!--#if int($ignore_samples) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-ignore_samples') $T('igsam-del').</span>
</div>
<div class="field-pair">
<div class="field-pair advanced-settings">
<label class="config" for="enable_meta">$T('opt-enable_meta')</label>
<input type="checkbox" name="enable_meta" id="enable_meta" value="1" <!--#if int($enable_meta) > 0 then 'checked="checked"' else ""#--> />
<span class="desc">$T('explain-enable_meta').replace('. ', '.<br/>')</span>
@@ -246,7 +251,7 @@
</fieldset>
</div><!-- /col1 -->
</div><!-- /section -->
<div class="section">
<div class="section advanced-settings">
<div class="col2">
<h3>$T('swtag-naming') <a href="$helpuri$help_uri#toc4" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
</div><!-- /col2 -->

View File

@@ -23,16 +23,32 @@ body {
overflow: visible;
border: 1px solid #dfdede;
background-color: #FFF;
border: 1px solid rgba(0, 0, 0, 0.2);
width: 100%
}
.section, .Servers form, #addFeed, #addFeedContent {
.advanced-button {
float: right;
width: auto;
margin: 0 4px 0px 0px;
font-size: 13px;
color: inherit;
height: auto;
padding-bottom: 5px;
}
#advanced-settings-button {
float: left;
margin: 2px 7px 0px 0px;
}
.advanced-buttonSeperator {
width: 1px;
height: 34px;
background-color: #dfdede;
float: right;
margin: 0px 10px;
}
.section, #addFeed, #addFeedContent {
border-bottom: 1px solid #dfdede;
overflow: auto;
}
.section:last-child, .Servers form:last-child {
border: 0;
}
.col2 {
z-index: 10;
float: left;
@@ -150,13 +166,13 @@ input[type="checkbox"]+.desc {
overflow: hidden;
min-width: 555px;
}
.field-pair:nth-child(odd),
.Key tr:nth-child(odd),
.tab-pane tr:nth-child(odd),
.even {
background-color: #F8F8F8;
}
.field-pair:last-child {
.field-pair:last-child,
.no-field-pair-bg {
background-color: transparent;
}
.alt,
@@ -298,7 +314,7 @@ tr.separator {
visibility: hidden;
}
.Categories form.sorting-row:nth-child(even) tr {
.Categories form.sorting-row:nth-child(2n-1) tr {
background-color: #F8F8F8;
}
@@ -1023,19 +1039,14 @@ input[type="checkbox"] {
color: black;
}
.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 {
float: right;
}
.Servers .chart-selector:hover {
opacity: 1;
.Servers .chart-selector-container .glyphicon {
font-size: 1.3em;
padding-right: 4px;
top: 5px;
}
.Servers .ct-grid.ct-vertical:first-of-type {
@@ -1083,9 +1094,10 @@ input[type="checkbox"] {
}
.host-warning {
color: #404040;
margin-left: 7px;
top: 3px;
color: #F0AD4E;
margin-left: 13px;
top: 5px;
font-size: 1.2em;
}
.fileBrowser .glyphicon {
@@ -1225,7 +1237,9 @@ input[type="checkbox"] {
margin-bottom: 0;
}
.Servers .server-chart {
.Servers .server-chart,
.Servers .chart-selector-container,
.Servers .advanced-buttonSeperator {
display: none;
}

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,6 @@
/*
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

View File

File diff suppressed because one or more lines are too long

View File

@@ -170,6 +170,10 @@
<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>

View File

@@ -150,7 +150,9 @@
</div>
<div class="row options-function-box">
<div class="col-sm-6">
<a href="./status/showlog?session=$session" target="_blank" class="btn btn-default"><span class="glyphicon glyphicon-file"></span> $T('link-showLog')</a>
<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>
</div>
<div class="col-sm-6">
<div class="input-group" data-tooltip="true" data-placement="top" title="$T('logging')">

8
interfaces/Glitter/templates/static/javascripts/moment.min.js vendored Normal file → Executable file
View File

File diff suppressed because one or more lines are too long

View File

@@ -19,7 +19,7 @@ var da = moment.defineLocale('da', {
longDateFormat : {
LT : 'HH:mm',
LTS : 'HH:mm:ss',
L : 'DD/MM/YYYY',
L : 'DD.MM.YYYY',
LL : 'D. MMMM YYYY',
LLL : 'D. MMMM YYYY HH:mm',
LLLL : 'dddd [d.] D. MMMM YYYY [kl.] HH:mm'

View File

@@ -28,7 +28,7 @@ function processRelativeTime(number, withoutSuffix, key, isFuture) {
var de = moment.defineLocale('de', {
months : 'Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
monthsShort : 'Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.'.split('_'),
monthsShort : 'Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),
monthsParseExact : true,
weekdays : 'Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag'.split('_'),
weekdaysShort : 'So._Mo._Di._Mi._Do._Fr._Sa.'.split('_'),

View File

@@ -13,6 +13,9 @@
var monthsShortDot = 'ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.'.split('_');
var monthsShort = 'ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic'.split('_');
var monthsParse = [/^ene/i, /^feb/i, /^mar/i, /^abr/i, /^may/i, /^jun/i, /^jul/i, /^ago/i, /^sep/i, /^oct/i, /^nov/i, /^dic/i];
var monthsRegex = /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;
var es = moment.defineLocale('es', {
months : 'enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre'.split('_'),
monthsShort : function (m, format) {
@@ -24,7 +27,13 @@ var es = moment.defineLocale('es', {
return monthsShortDot[m.month()];
}
},
monthsParseExact : true,
monthsRegex : monthsRegex,
monthsShortRegex : monthsRegex,
monthsStrictRegex : /^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,
monthsShortStrictRegex : /^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,
monthsParse : monthsParse,
longMonthsParse : monthsParse,
shortMonthsParse : monthsParse,
weekdays : 'domingo_lunes_martes_miércoles_jueves_viernes_sábado'.split('_'),
weekdaysShort : 'dom._lun._mar._mié._jue._vie._sáb.'.split('_'),
weekdaysMin : 'do_lu_ma_mi_ju_vi_sá'.split('_'),

View File

View File

View File

@@ -0,0 +1,99 @@
//! moment.js locale configuration
//! locale : Hebrew [he]
//! author : Tomer Cohen : https://github.com/tomer
//! author : Moshe Simantov : https://github.com/DevelopmentIL
//! author : Tal Ater : https://github.com/TalAter
;(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined'
&& typeof require === 'function' ? factory(require('../moment')) :
typeof define === 'function' && define.amd ? define(['../moment'], factory) :
factory(global.moment)
}(this, (function (moment) { 'use strict';
var he = moment.defineLocale('he', {
months : 'ינואר_פברואר_מרץ_אפריל_מאי_יוני_יוליוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר'.split('_'),
monthsShort : 'ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יוליוג׳_ספט׳וק׳וב׳_דצמ׳'.split('_'),
weekdays : 'ראשון_שני_שלישי_רביעי_חמישיישי_שבת'.split('_'),
weekdaysShort : ׳׳׳׳׳_ו׳׳'.split('_'),
weekdaysMin : 'א_ב_ג_ד_ה_ו_ש'.split('_'),
longDateFormat : {
LT : 'HH:mm',
LTS : 'HH:mm:ss',
L : 'DD/MM/YYYY',
LL : 'D [ב]MMMM YYYY',
LLL : 'D [ב]MMMM YYYY HH:mm',
LLLL : 'dddd, D [ב]MMMM YYYY HH:mm',
l : 'D/M/YYYY',
ll : 'D MMM YYYY',
lll : 'D MMM YYYY HH:mm',
llll : 'ddd, D MMM YYYY HH:mm'
},
calendar : {
sameDay : '[היום ב־]LT',
nextDay : '[מחר ב־]LT',
nextWeek : 'dddd [בשעה] LT',
lastDay : '[אתמול ב־]LT',
lastWeek : '[ביום] dddd [האחרון בשעה] LT',
sameElse : 'L'
},
relativeTime : {
future : 'בעוד %s',
past : 'לפני %s',
s : 'מספר שניות',
m : 'דקה',
mm : '%d דקות',
h : 'שעה',
hh : function (number) {
if (number === 2) {
return 'שעתיים';
}
return number + ' שעות';
},
d : 'יום',
dd : function (number) {
if (number === 2) {
return 'יומיים';
}
return number + ' ימים';
},
M : 'חודש',
MM : function (number) {
if (number === 2) {
return 'חודשיים';
}
return number + ' חודשים';
},
y : 'שנה',
yy : function (number) {
if (number === 2) {
return 'שנתיים';
} else if (number % 10 === 0 && number !== 10) {
return number + ' שנה';
}
return number + ' שנים';
}
},
meridiemParse: /אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,
isPM : function (input) {
return /^(אחה"צ|אחרי הצהריים|בערב)$/.test(input);
},
meridiem : function (hour, minute, isLower) {
if (hour < 5) {
return 'לפנות בוקר';
} else if (hour < 10) {
return 'בבוקר';
} else if (hour < 12) {
return isLower ? 'לפנה"צ' : 'לפני הצהריים';
} else if (hour < 18) {
return isLower ? 'אחה"צ' : 'אחרי הצהריים';
} else {
return 'בערב';
}
}
});
return he;
})));

View File

View File

@@ -40,7 +40,7 @@ var nl = moment.defineLocale('nl', {
weekdays : 'zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag'.split('_'),
weekdaysShort : 'zo._ma._di._wo._do._vr._za.'.split('_'),
weekdaysMin : 'Zo_Ma_Di_Wo_Do_Vr_Za'.split('_'),
weekdaysMin : 'zo_ma_di_wo_do_vr_za'.split('_'),
weekdaysParseExact : true,
longDateFormat : {
LT : 'HH:mm',

View File

@@ -63,7 +63,24 @@ var pl = moment.defineLocale('pl', {
calendar : {
sameDay: '[Dziś o] LT',
nextDay: '[Jutro o] LT',
nextWeek: '[W] dddd [o] LT',
nextWeek: function () {
switch (this.day()) {
case 0:
return '[W niedzielę o] LT';
case 2:
return '[We wtorek o] LT';
case 3:
return '[W środę o] LT';
case 6:
return '[W sobotę o] LT';
default:
return '[W] dddd [o] LT';
}
},
lastDay: '[Wczoraj o] LT',
lastWeek: function () {
switch (this.day()) {

View File

@@ -11,8 +11,8 @@
var ptBr = moment.defineLocale('pt-br', {
months : 'Janeiro_Fevereiro_Março_Abril_Maio_Junho_Julho_Agosto_Setembro_Outubro_Novembro_Dezembro'.split('_'),
monthsShort : 'Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez'.split('_'),
months : 'janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro'.split('_'),
monthsShort : 'jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez'.split('_'),
weekdays : 'Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado'.split('_'),
weekdaysShort : 'Dom_Seg_Ter_Qua_Qui_Sex_Sáb'.split('_'),
weekdaysMin : 'Do_2ª_3ª_4ª_5ª_6ª_Sá'.split('_'),
@@ -41,6 +41,7 @@ var ptBr = moment.defineLocale('pt-br', {
future : 'em %s',
past : '%s atrás',
s : 'poucos segundos',
ss : '%d segundos',
m : 'um minuto',
mm : '%d minutos',
h : 'uma hora',

View File

View File

@@ -174,7 +174,7 @@ var ru = moment.defineLocale('ru', {
},
week : {
dow : 1, // Monday is the first day of the week.
doy : 7 // The week that contains Jan 1st is the first week of the year.
doy : 4 // The week that contains Jan 4th is the first week of the year.
}
});

View File

View File

View File

View File

@@ -772,8 +772,8 @@ tr.queue-item>td:first-child>a {
line-height: 24px;
overflow: visible;
margin-bottom: 0;
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);
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);
}
.progress>span,

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 729 B

After

Width:  |  Height:  |  Size: 726 B

View File

@@ -79,7 +79,6 @@
input = input.replace(/%0e/g,'05');
input = input.replace(/%e/g,'5');
input = input.replace(/%fn/g,'$T("sort-File")');
input = input.replace(/%dn/g,'$T("sort-Folder")');
document.getElementById('previewtv').innerHTML = getOutput(input);
}

View File

@@ -16,6 +16,10 @@
<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>

View File

@@ -12,7 +12,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ASCII\n"
"Content-Transfer-Encoding: 7bit\n"
"POT-Creation-Date: 2017-10-21 16:01+W. Europe Daylight Time\n"
"POT-Creation-Date: 2017-12-06 10:56+W. Europe Standard Time\n"
"Generated-By: pygettext.py 1.5\n"
@@ -534,6 +534,12 @@ 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 ""
@@ -700,7 +706,7 @@ msgstr ""
msgid "m"
msgstr ""
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr ""
@@ -728,6 +734,10 @@ 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
@@ -903,6 +913,7 @@ 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"
@@ -928,10 +939,6 @@ 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 ""
@@ -1038,11 +1045,6 @@ 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 ""
@@ -1440,10 +1442,6 @@ msgstr ""
msgid "Failed to move files"
msgstr ""
#: sabnzbd/postproc.py
msgid "Running script"
msgstr ""
#: sabnzbd/postproc.py
msgid "Running user script %s"
msgstr ""
@@ -1464,7 +1462,7 @@ msgstr ""
msgid "Post Processing Failed for %s (%s)"
msgstr ""
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr ""
@@ -3248,7 +3246,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr ""
@@ -3860,6 +3858,10 @@ msgstr ""
msgid "S01E05 Episode Folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr ""
@@ -3929,7 +3931,7 @@ msgid "Original Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
@@ -3948,10 +3950,6 @@ msgstr ""
msgid "file"
msgstr ""
#: sabnzbd/skintext.py
msgid "folder"
msgstr ""
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr ""
@@ -4288,6 +4286,10 @@ 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&rarr;Newest</small>"
msgstr ""
@@ -4636,16 +4638,16 @@ msgstr ""
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr ""
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr ""
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr ""
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr ""

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-10-25 23:30+0000\n"
"PO-Revision-Date: 2017-06-22 07:07+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
"POT-Creation-Date: 2017-12-06 10:30+0000\n"
"PO-Revision-Date: 2017-10-27 21:53+0000\n"
"Last-Translator: Søren <Unknown>\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-10-26 05:45+0000\n"
"X-Generator: Launchpad (build 18484)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:30+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -29,11 +29,14 @@ 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!"
@@ -45,11 +48,11 @@ msgstr "par2 binær... IKKE fundet!"
#: SABnzbd.py [Error message] # SABnzbd.py [Error message]
msgid "Verification and repair will not be possible."
msgstr ""
msgstr "Verificering og reperation er ikke muligt."
#: SABnzbd.py [Error message]
msgid "MultiPar binary... NOT found!"
msgstr ""
msgstr "MultiPar binær... IKKE fundet!"
#: SABnzbd.py [Warning message]
msgid "Your UNRAR version is %s, we recommend version %s or higher.<br />"
@@ -57,7 +60,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 ""
msgstr "Downloads vil ikke blive udpakket."
#: SABnzbd.py [Error message]
msgid "unrar binary... NOT found"
@@ -564,6 +567,12 @@ 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"
@@ -764,7 +773,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "Kan ikke oprette mappe %s"
@@ -794,6 +803,10 @@ 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
@@ -969,6 +982,7 @@ 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"
@@ -997,10 +1011,6 @@ 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"
@@ -1110,11 +1120,6 @@ 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"
@@ -1550,10 +1555,6 @@ 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"
@@ -1574,7 +1575,7 @@ msgstr "Mere"
msgid "Post Processing Failed for %s (%s)"
msgstr "Efterbehandling mislykkedes for %s (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "se logfil"
@@ -3501,7 +3502,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/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Maksimalt antal forsøg"
@@ -4145,6 +4146,10 @@ msgstr "1x05 Episodemappe"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Episodemappe"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Titel"
@@ -4214,8 +4219,8 @@ msgid "Original Filename"
msgstr "Originalfilnavn"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Orginal Mappenavn"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4233,10 +4238,6 @@ msgstr "tekst"
msgid "file"
msgstr "fil"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "mappe"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Sorteringsstreng"
@@ -4585,6 +4586,12 @@ 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&rarr;Newest</small>"
msgstr "Sortere efter alder <small>Ældst&rarr;Nyeste</small>"
@@ -4953,16 +4960,16 @@ msgstr ""
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "Har du ingen usenet leverandør? Vi anbefaler at prøve %s."
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Det lykkedes ikke at hente TV info (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Det lykkedes ikke at omdøbe: %s til %s"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Kunne ikke omdøbe lignende fil: %s til %s"
@@ -5058,6 +5065,9 @@ 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"
@@ -5404,6 +5414,12 @@ msgstr "URL hentning mislykkedes; %s"
#~ msgid "Show times in AM/PM notation (does not affect scheduler)."
#~ msgstr "Vis tider i AM / PM notation (påvirker ikke skemalægger)."
#~ msgid "folder"
#~ msgstr "mappe"
#~ msgid "Original Foldername"
#~ msgstr "Orginal Mappenavn"
#~ msgid "Groups / Indexer tags"
#~ msgstr "Gruppe / Index tags"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-10-25 23:30+0000\n"
"POT-Creation-Date: 2017-12-06 10:30+0000\n"
"PO-Revision-Date: 2017-10-10 19:03+0000\n"
"Last-Translator: Robin Munkittrick <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-10-26 05:45+0000\n"
"X-Generator: Launchpad (build 18484)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:30+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "MultiPar binary... NOT found!"
@@ -586,6 +586,12 @@ 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"
@@ -788,7 +794,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "Verzeichnis %s konnte nicht angelegt werden"
@@ -821,6 +827,10 @@ 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
@@ -1000,6 +1010,7 @@ 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"
@@ -1028,10 +1039,6 @@ 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"
@@ -1148,11 +1155,6 @@ 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"
@@ -1610,10 +1612,6 @@ 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"
@@ -1634,7 +1632,7 @@ msgstr "Mehr"
msgid "Post Processing Failed for %s (%s)"
msgstr "Nachbearbeitung von %s fehlgeschlagen (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "Beachten Sie die Protokolldatei"
@@ -3602,7 +3600,7 @@ msgstr ""
"Die Performanz verbessern, indem eine schwächere SSL-Verschlüsselung "
"erzwungen wird."
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Maximale Wiederholungen"
@@ -4256,6 +4254,10 @@ msgstr "1x05 Episoden-Ordner"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Episoden-Ordner"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Titel"
@@ -4325,8 +4327,8 @@ msgid "Original Filename"
msgstr "Ursprünglicher Dateiname"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Ursprünglicher Ordnername"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4344,10 +4346,6 @@ msgstr "text"
msgid "file"
msgstr "Datei"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "Ordner"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Sortieranweisung"
@@ -4697,6 +4695,12 @@ 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&rarr;Newest</small>"
msgstr "Sortieren nach Alter <small>Älteste&rarr;Neuste</small>"
@@ -5068,16 +5072,16 @@ msgstr ""
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "Wenn Sie noch keinen Usenet-Provider haben, empfehlen wir Ihnen %s."
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Fehler beim Abrufen der TV-Informationen: %s"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Umbenennen von %s nach %s fehlgeschlagen."
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Umbenennen der gleichen Datei von %s nach %s fehlgeschlagen."
@@ -5561,6 +5565,12 @@ msgstr "Abrufen der URL fehlgeschlagen; %s"
#~ msgid "Show times in AM/PM notation (does not affect scheduler)."
#~ msgstr "Zeiten in der AM/PM-Notation anzeigen (betrifft die Regeln nicht)."
#~ msgid "folder"
#~ msgstr "Ordner"
#~ msgid "Original Foldername"
#~ msgstr "Ursprünglicher Ordnername"
#~ msgid "Groups / Indexer tags"
#~ msgstr "Gruppen/Indexer-Tags"
@@ -5646,6 +5656,9 @@ 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 />"

View File

@@ -69,9 +69,6 @@ msgstr "Replace spaces in folder name"
msgid "Replace dots in Foldername"
msgstr "Replace dots in folder name"
msgid "Original Foldername"
msgstr "Original folder name"
msgid "How long or untill when do you want to pause? (in English!)"
msgstr "How long or until when do you want to pause? (in English!)"
@@ -119,3 +116,7 @@ msgstr "Downloads will not be unpacked."
msgid "Seperate multiple URLs by a comma"
msgstr "Separate multiple URLs with a comma"
msgid "Advanced"
msgstr "Advanced Settings"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-10-25 23:30+0000\n"
"POT-Creation-Date: 2017-12-06 10: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-10-26 05:46+0000\n"
"X-Generator: Launchpad (build 18484)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -566,6 +566,12 @@ 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"
@@ -766,7 +772,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "No se pudo crear el directorio %s"
@@ -796,6 +802,10 @@ 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
@@ -975,6 +985,7 @@ 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"
@@ -1003,10 +1014,6 @@ 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"
@@ -1118,11 +1125,6 @@ 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"
@@ -1567,10 +1569,6 @@ 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"
@@ -1591,7 +1589,7 @@ msgstr "Más"
msgid "Post Processing Failed for %s (%s)"
msgstr "Error al post-procesar %s (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "ver fichero de log"
@@ -3523,7 +3521,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Reintentos máximos"
@@ -4168,6 +4166,10 @@ msgstr "1x05 Episodio Directorio"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Episodio Directorio"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Título"
@@ -4237,8 +4239,8 @@ msgid "Original Filename"
msgstr "Nombre fichero original"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Nombre directorio original"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4256,10 +4258,6 @@ msgstr "texto"
msgid "file"
msgstr "archivo"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "carpeta"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Ordenar cadena"
@@ -4610,6 +4608,12 @@ 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&rarr;Newest</small>"
msgstr "Ordenar por Fecha <small>Más viejo&rarr;Más nuevo</small>"
@@ -4979,16 +4983,16 @@ msgstr ""
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "¿No tienes proveedor de Usenet? Nosotros recomendamos probar %s."
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Error al recuperar info de la serie (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Error al renombrar: %s a %s"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Error al renombrar ficheros similares: %s a %s"
@@ -5091,6 +5095,9 @@ 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"
@@ -5284,6 +5291,9 @@ msgstr "Error al recuperar la URL; %s"
#~ msgid "Email Options"
#~ msgstr "Opciones de e-mail"
#~ msgid "folder"
#~ msgstr "carpeta"
#~ msgid "Are you sure you want to delete"
#~ msgstr "¿Está seguro de querer borrar?"
@@ -5459,6 +5469,9 @@ msgstr "Error al recuperar la URL; %s"
#~ msgid "Enable if downloads are not put in their own folders."
#~ msgstr "Habilitar si las descargas no quedan en sus propios directorios."
#~ msgid "Original Foldername"
#~ msgstr "Nombre directorio original"
#~ msgid "Enable sorting and renaming of date named files."
#~ msgstr "Habilitar ordenación y renombrado de nombres de ficheros con fechas."

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-10-25 23:30+0000\n"
"POT-Creation-Date: 2017-12-06 10: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-10-26 05:45+0000\n"
"X-Generator: Launchpad (build 18484)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:30+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -563,6 +563,12 @@ 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"
@@ -762,7 +768,7 @@ msgstr "t"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "Ei voi luoda kansiota %s"
@@ -792,6 +798,10 @@ 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
@@ -968,6 +978,7 @@ 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"
@@ -995,10 +1006,6 @@ 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"
@@ -1108,11 +1115,6 @@ 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"
@@ -1554,10 +1556,6 @@ 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"
@@ -1578,7 +1576,7 @@ msgstr "Lisää"
msgid "Post Processing Failed for %s (%s)"
msgstr "Jälkikäsittely epäonnistui kohteelle %s (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "katso lokitiedosto"
@@ -3512,7 +3510,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/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Enimmäismäärä uudelleenyrityksille"
@@ -4158,6 +4156,10 @@ msgstr "1x05 Jakso kansio"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Jakso kansio"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Nimi"
@@ -4227,8 +4229,8 @@ msgid "Original Filename"
msgstr "Alkuperäinen tiedostonimi"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Alkuperäinen kansionimi"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4246,10 +4248,6 @@ msgstr "teksti"
msgid "file"
msgstr "tiedosto"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "kansio"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Lajittelumerkkijono"
@@ -4601,6 +4599,12 @@ 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&rarr;Newest</small>"
msgstr "Järjestä iän mukaan <small>Vanhin&rarr;Uusin</small>"
@@ -4969,16 +4973,16 @@ msgstr ""
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "Eikö sinulla ole usenet tarjoajaa? Suosittelemme kokeilemaan %s."
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Virhe noudettaessa TV tietoja (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Virhe uudelleennimettäessä: %s %s"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Samankaltaisen tiedoston uudelleennimeäminen epäonnistui: %s %s"
@@ -5129,6 +5133,9 @@ msgstr "Osoitteen nouto epäonnistui; %s"
#~ 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 />"
@@ -5394,6 +5401,12 @@ msgstr "Osoitteen nouto epäonnistui; %s"
#~ msgstr ""
#~ "Kansio jossa ovat käyttäjän skriptit joita käytetään jälkikäsittelyssä."
#~ msgid "Original Foldername"
#~ msgstr "Alkuperäinen kansionimi"
#~ msgid "folder"
#~ msgstr "kansio"
#~ msgid "Hour:Min"
#~ msgstr "Tunti:Min"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-10-25 23:30+0000\n"
"PO-Revision-Date: 2017-10-05 18:52+0000\n"
"POT-Creation-Date: 2017-12-06 10:30+0000\n"
"PO-Revision-Date: 2017-12-06 19:46+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-10-26 05:45+0000\n"
"X-Generator: Launchpad (build 18484)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:30+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -590,6 +590,12 @@ 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"
@@ -763,6 +769,8 @@ msgstr "Paramètre incorrect"
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"
@@ -792,7 +800,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "Impossible de créer le dossier %s"
@@ -825,6 +833,10 @@ 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
@@ -1007,6 +1019,7 @@ 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"
@@ -1036,10 +1049,6 @@ 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"
@@ -1155,11 +1164,6 @@ 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"
@@ -1614,10 +1618,6 @@ 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 +1638,7 @@ msgstr "Plus"
msgid "Post Processing Failed for %s (%s)"
msgstr "Échec du post-traitement pour %s (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "voir le journal"
@@ -3609,7 +3609,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/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Nombre de tentatives maximum"
@@ -4270,6 +4270,10 @@ msgstr "1x05 Dossier Épisode"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Dossier Épisode"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr "Nom de la tâche en tant que nom de fichier"
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Titre"
@@ -4339,8 +4343,8 @@ msgid "Original Filename"
msgstr "Nom de fichier originel"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Nom du dossier originel"
msgid "Original Job Name"
msgstr "Nom d'origine de la tâche"
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4358,10 +4362,6 @@ msgstr "texte"
msgid "file"
msgstr "fichier"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "dossier"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Chaîne de caractères de tri"
@@ -4713,6 +4713,14 @@ 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&rarr;Newest</small>"
msgstr "Trier par Age <small>Moins récent&rarr;Plus récent</small>"
@@ -5085,16 +5093,16 @@ msgid "Don't have a usenet provider? We recommend trying %s."
msgstr ""
"Vous n'avez pas de fournisseur usenet? Nous vous recommendons d'essayer %s."
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Erreur lors de l'obtention des information TV (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Échec du renommage : %s en %s"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Impossible de renommer le fichier similaire : %s en %s"
@@ -5429,6 +5437,9 @@ msgstr "Échec de récupération de l'URL ; %s"
#~ msgid "Enable sorting and renaming of date named files."
#~ msgstr "Active le tri et le renommage des fichiers par date."
#~ msgid "folder"
#~ msgstr "dossier"
#~ msgid "Set Pause Interval"
#~ msgstr "Intervalle de pause"
@@ -5605,6 +5616,9 @@ 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"
@@ -5691,6 +5705,9 @@ msgstr "Échec de récupération de l'URL ; %s"
#~ msgid "Groups / Indexer tags"
#~ msgstr "balises Groupes / Indexeur"
#~ msgid "Original Foldername"
#~ msgstr "Nom du dossier originel"
#~ msgid ""
#~ "After SABnzbd has finished restarting you will be able to access it at the "
#~ "following location: %s"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-10-25 23:30+0000\n"
"PO-Revision-Date: 2017-10-07 08:28+0000\n"
"POT-Creation-Date: 2017-12-06 10:30+0000\n"
"PO-Revision-Date: 2017-12-06 19:50+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-10-26 05:45+0000\n"
"X-Generator: Launchpad (build 18484)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:30+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -447,7 +447,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,6 +558,12 @@ 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,7 +730,7 @@ msgstr "משתנה לא נכון"
#: sabnzbd/interface.py
msgid ""
"Category folder cannot be a subfolder of the Temporary Download Folder."
msgstr ""
msgstr ".תיקיית מדור אינה יכולה להיות תת-תיקייה של תיקיית ההורדות הזמניות"
#: sabnzbd/interface.py # sabnzbd/interface.py
msgid "Back"
@@ -754,7 +760,7 @@ msgstr "ש"
msgid "m"
msgstr "ד"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "%s לא יכול ליצור את הספרייה"
@@ -786,11 +792,15 @@ 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]
@@ -961,6 +971,7 @@ 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"
@@ -987,10 +998,6 @@ 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"
@@ -1081,7 +1088,7 @@ msgstr "התווסף NZB"
#: sabnzbd/notifier.py
msgid "Post-processing started"
msgstr "לאחר-עיבוד התחיל"
msgstr "בתר-עיבוד התחיל"
#: sabnzbd/notifier.py [Notification]
msgid "Job finished"
@@ -1103,11 +1110,6 @@ 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 נכשל בשליחת הודעת"
@@ -1529,7 +1531,7 @@ msgstr "הורדה נכשלה - לא בשרת(ים) שלך"
#: sabnzbd/postproc.py
msgid "No post-processing because of failed verification"
msgstr "אין לאחר-עיבוד בגלל וידוא כושל"
msgstr "אין בתר-עיבוד בגלל וידוא כושל"
#: sabnzbd/postproc.py
msgid "Moving"
@@ -1547,10 +1549,6 @@ 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 מריץ תסריט משתמש"
@@ -1569,9 +1567,9 @@ msgstr "עוד"
#: sabnzbd/postproc.py [Error message]
msgid "Post Processing Failed for %s (%s)"
msgstr "%s (%s) לאחר-עיבוד נכשל עבור"
msgstr "%s (%s) בתר-עיבוד נכשל עבור"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "ראה קובץ יומן"
@@ -1597,7 +1595,7 @@ msgstr "%s לא יכול ליצור תיקייה סופית"
#: sabnzbd/postproc.py
msgid "Post-processing"
msgstr "לאחר-עיבוד"
msgstr "בתר-עיבוד"
#: sabnzbd/postproc.py
msgid "[%s] No par2 sets"
@@ -1833,11 +1831,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"
@@ -3157,11 +3155,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"
@@ -3288,8 +3286,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"
@@ -3381,12 +3379,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"
@@ -3415,7 +3413,7 @@ msgstr "שרת"
#: sabnzbd/skintext.py
msgid "Post processing"
msgstr "לאחר-עיבוד"
msgstr "בתר-עיבוד"
#: sabnzbd/skintext.py
msgid "Naming"
@@ -3477,7 +3475,7 @@ msgstr "SSL צפני"
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ".חלש יותר SSL הגבר ביצועים ע\"י אילוץ חוזק הצפנת"
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "ניסיונות חוזרים מרביים"
@@ -4121,6 +4119,10 @@ msgstr "1x05 תיקיית פרק"
msgid "S01E05 Episode Folder"
msgstr "S01E05 תיקיית פרק"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr "שם עבודה בתור שם קובץ"
#: sabnzbd/skintext.py
msgid "Title"
msgstr "כותר"
@@ -4190,8 +4192,8 @@ msgid "Original Filename"
msgstr "שם מקורי של קובץ"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "שם קובץ מקורי"
msgid "Original Job Name"
msgstr "שם עבודה מקורי"
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4209,10 +4211,6 @@ msgstr "text"
msgid "file"
msgstr "קובץ"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "תיקייה"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "מיין מחרוזת"
@@ -4560,6 +4558,14 @@ 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&rarr;Newest</small>"
msgstr "מיין לפי גיל <small>החדש ביותר&rarr;הישן ביותר</small>"
@@ -4924,16 +4930,16 @@ msgstr ""
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr ".%s אנו ממליצים לנסות את ?usenet אין לך ספק"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "(%s) שגיאה בהשגת מידע טלוויזיה"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "%s אל %s:נכשל בשינוי שם"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "%s אל %s :נכשל בשינוי שם של קובץ דומה"
@@ -4977,6 +4983,9 @@ msgstr "%s ;משיכת כתובת נכשלה"
#~ msgid "Skip"
#~ msgstr "דלג"
#~ msgid "folder"
#~ msgstr "תיקייה"
#~ msgid "OK"
#~ msgstr "אישור"
@@ -5005,6 +5014,9 @@ msgstr "%s ;משיכת כתובת נכשלה"
#~ "Replace illegal characters in folder names by equivalents (otherwise remove)."
#~ msgstr ".(החלף תווים בלתי חוקיים בשמות תיקיות בשווי ערך (אחרת יימחקו"
#~ msgid "Original Foldername"
#~ msgstr "שם קובץ מקורי"
#~ msgid "Folder \"%s\" does not exist"
#~ msgstr "אינה קיימת \"%s\" התיקייה"
@@ -5014,6 +5026,9 @@ msgstr "%s ;משיכת כתובת נכשלה"
#~ 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>"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-10-25 23:30+0000\n"
"POT-Creation-Date: 2017-12-06 10: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-10-26 05:46+0000\n"
"X-Generator: Launchpad (build 18484)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -559,6 +559,12 @@ 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"
@@ -758,7 +764,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "Kan ikke opprette mappe %s"
@@ -788,6 +794,10 @@ 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
@@ -963,6 +973,7 @@ 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"
@@ -990,10 +1001,6 @@ 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"
@@ -1104,11 +1111,6 @@ 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"
@@ -1546,10 +1548,6 @@ 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"
@@ -1570,7 +1568,7 @@ msgstr "Mer"
msgid "Post Processing Failed for %s (%s)"
msgstr "Etterbehandling mislyktes for %s (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "se loggfil"
@@ -3476,7 +3474,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Maksimum antall forsøk"
@@ -4114,6 +4112,10 @@ msgstr "1x05 Episodemappe"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Episodemappe"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Tittel"
@@ -4183,8 +4185,8 @@ msgid "Original Filename"
msgstr "Originalfilnavn"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Originalt mappenavn"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4202,10 +4204,6 @@ msgstr "tekst"
msgid "file"
msgstr "fil"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "mappe"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Sorteringsstreng"
@@ -4553,6 +4551,12 @@ 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&rarr;Newest</small>"
msgstr "Sorter etter alder <small>Eldst&rarr;Ny</small>"
@@ -4921,16 +4925,16 @@ msgstr ""
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "Har du ikke noen usenet leverandør? Vi anbefaler å prøve %s."
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Kunne ikke hente TV info (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Kunne ikke endre navn fra: %s til %s"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Kunne ikke endre navn på lik fil: %s til %s"
@@ -5013,6 +5017,9 @@ 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"
@@ -5442,6 +5449,9 @@ msgstr "URL henting mislyktes; %s"
#~ msgid "Open Source URL"
#~ msgstr "Åpen kildekode URL"
#~ msgid "Original Foldername"
#~ msgstr "Originalt mappenavn"
#~ msgid "Groups / Indexer tags"
#~ msgstr "Grupper / Indeks etiketter"
@@ -5507,3 +5517,6 @@ msgstr "URL henting mislyktes; %s"
#~ msgstr ""
#~ "Send automatisk beregnet valideringsresultater for nedlastinger til "
#~ "indekserer."
#~ msgid "folder"
#~ msgstr "mappe"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-10-25 23:30+0000\n"
"PO-Revision-Date: 2017-10-20 09:43+0000\n"
"POT-Creation-Date: 2017-12-06 10:30+0000\n"
"PO-Revision-Date: 2017-12-08 10:47+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-10-26 05:45+0000\n"
"X-Generator: Launchpad (build 18484)\n"
"X-Launchpad-Export-Date: 2017-12-09 05:32+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -581,6 +581,12 @@ 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"
@@ -752,6 +758,8 @@ msgstr "Incorrecte parameter"
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"
@@ -781,7 +789,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "Niet mogelijk directory %s aan te maken"
@@ -814,6 +822,10 @@ 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
@@ -989,6 +1001,7 @@ 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"
@@ -1016,10 +1029,6 @@ 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"
@@ -1134,11 +1143,6 @@ 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"
@@ -1583,10 +1587,6 @@ 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 +1607,7 @@ msgstr "Meer"
msgid "Post Processing Failed for %s (%s)"
msgstr "Nabewerking van %s mislukt (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "zie logbestand"
@@ -3555,7 +3555,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/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Maximum aantal pogingen"
@@ -4214,6 +4214,10 @@ msgstr "1x05 Aflevering-map"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Aflevering-map"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr "Downloadnaam als Bestandsnaam"
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Titel"
@@ -4283,8 +4287,8 @@ msgid "Original Filename"
msgstr "Originele bestandsnaam"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Oorspronkelijke mapnaam"
msgid "Original Job Name"
msgstr "Originele Downloadnaam"
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4302,10 +4306,6 @@ msgstr "tekst"
msgid "file"
msgstr "bestand"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "map"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Sorteertekst"
@@ -4654,6 +4654,14 @@ 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 ""
"Alle gebruikersnamen, wachtwoorden en API-sleutels worden automatisch "
"verwijderd uit het logbestand en de bijgevoegde kopie van je instellingen."
#: sabnzbd/skintext.py
msgid "Sort by Age <small>Oldest&rarr;Newest</small>"
msgstr "Sorteer op Leeftijd <small>Oud&rarr;Nieuw</small>"
@@ -5021,16 +5029,16 @@ msgstr ""
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "Heb je nog geen Usenet provider? Wij bevelen %s aan."
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Fout bij ophalen TV info (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Hernoemen van %s tot %s mislukt"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Hernoemen van gelijkaardig bestand %s naar %s mislukt"
@@ -5108,6 +5116,9 @@ 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"
@@ -5430,6 +5441,12 @@ msgstr "URL ophalen mislukt; %s"
#~ msgid "OK"
#~ msgstr "OK"
#~ msgid "folder"
#~ msgstr "map"
#~ msgid "Original Foldername"
#~ msgstr "Oorspronkelijke mapnaam"
#~ msgid "Groups / Indexer tags"
#~ msgstr "Groepen / Indexer markeringen"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-10-25 23:30+0000\n"
"POT-Creation-Date: 2017-12-06 10: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-10-26 05:46+0000\n"
"X-Generator: Launchpad (build 18484)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -561,6 +561,12 @@ 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"
@@ -761,7 +767,7 @@ msgstr "g"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "Nie można utworzyć katalogu %s"
@@ -791,6 +797,10 @@ 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
@@ -966,6 +976,7 @@ 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"
@@ -994,10 +1005,6 @@ 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"
@@ -1109,11 +1116,6 @@ 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"
@@ -1554,10 +1556,6 @@ 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"
@@ -1578,7 +1576,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
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "sprawdź logi"
@@ -3493,7 +3491,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Maksymalna ilość prób"
@@ -4132,6 +4130,10 @@ msgstr "Katalog odcinka 1x05"
msgid "S01E05 Episode Folder"
msgstr "Katalog odcinka S01E05"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Tytuł"
@@ -4201,8 +4203,8 @@ msgid "Original Filename"
msgstr "Oryginalna nazwa pliku"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Oryginalna nazwa katalogu"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4220,10 +4222,6 @@ msgstr "tekst"
msgid "file"
msgstr "plik"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "katalog"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Wzorzec sortowania"
@@ -4571,6 +4569,12 @@ 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&rarr;Newest</small>"
msgstr "Sortuj według wieku <small>Najstarsze&rarr;Najnowsze</small>"
@@ -4937,16 +4941,16 @@ msgstr ""
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "Nie masz dostawcy Usenet? Polecamy spróbować %s."
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Błąd pobierania informacji TV (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Nie udało się zmienić nazwy %s na %s"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Nie udało się zmienić nazwy podobnego pliku %s na %s"
@@ -5199,6 +5203,12 @@ msgstr "Pobieranie URL nie powiodło się; %s"
#~ msgid "Generic Sorting"
#~ msgstr "Sortowanie standardowe"
#~ msgid "folder"
#~ msgstr "katalog"
#~ msgid "Original Foldername"
#~ msgstr "Oryginalna nazwa katalogu"
#~ msgid "Are you sure you want to delete"
#~ msgstr "Czy na pewno usunąć?"
@@ -5279,6 +5289,9 @@ 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"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-10-25 23:30+0000\n"
"POT-Creation-Date: 2017-12-06 10: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-10-26 05:46+0000\n"
"X-Generator: Launchpad (build 18484)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -562,6 +562,12 @@ 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"
@@ -761,7 +767,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "Não é possível criar a pasta %s"
@@ -791,6 +797,10 @@ 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
@@ -966,6 +976,7 @@ 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"
@@ -993,10 +1004,6 @@ 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"
@@ -1106,11 +1113,6 @@ 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"
@@ -1552,10 +1554,6 @@ 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"
@@ -1576,7 +1574,7 @@ msgstr "Mais"
msgid "Post Processing Failed for %s (%s)"
msgstr "O pós-processamento falhou para %s (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "veja o arquivo de log"
@@ -3490,7 +3488,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Máximo de tentativas"
@@ -4130,6 +4128,10 @@ msgstr "1x05 Pasta Do Episódio"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Pasta Do Episódio"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Tí­tulo"
@@ -4199,8 +4201,8 @@ msgid "Original Filename"
msgstr "Nome do arquivo original"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Nome da pasta original"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4218,10 +4220,6 @@ msgstr "texto"
msgid "file"
msgstr "arquivo"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "pasta"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "String de ordenação"
@@ -4569,6 +4567,12 @@ 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&rarr;Newest</small>"
msgstr "Ordenar por Idade <small>Mais antigo&rarr;Mais novo</small>"
@@ -4938,16 +4942,16 @@ msgstr ""
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "Não tem um provedor usenet? Recomendamos testar %s."
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Erro ao obter informações de TV (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Falha ao renomear: %s para %s"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Falha ao renomear arquivo similar: %s para %s"
@@ -5044,6 +5048,9 @@ 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"
@@ -5367,6 +5374,12 @@ msgstr "A busca da URL falhou; %s"
#~ msgid "Generic Sorting"
#~ msgstr "Ordenação genérica"
#~ msgid "Original Foldername"
#~ msgstr "Nome da pasta original"
#~ msgid "folder"
#~ msgstr "pasta"
#~ msgid "Enable sorting and renaming of episodes."
#~ msgstr "Ativa a ordenação e renomeação de episódios."

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-10-25 23:30+0000\n"
"POT-Creation-Date: 2017-12-06 10: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-10-26 05:46+0000\n"
"X-Generator: Launchpad (build 18484)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -564,6 +564,12 @@ 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"
@@ -764,7 +770,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "Nu pot crea dosarul %s"
@@ -794,6 +800,10 @@ 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
@@ -969,6 +979,7 @@ 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"
@@ -997,10 +1008,6 @@ 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"
@@ -1110,11 +1117,6 @@ 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"
@@ -1558,10 +1560,6 @@ 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"
@@ -1582,7 +1580,7 @@ msgstr "Mai mult"
msgid "Post Processing Failed for %s (%s)"
msgstr "Post Procesare Nereuşită pentru %s (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "vezi fişier jurnal"
@@ -3492,7 +3490,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Număr Maxim reîncercări"
@@ -4134,6 +4132,10 @@ msgstr "1x05 Dosar Episod"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Dosar Episod"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Titlu"
@@ -4203,8 +4205,8 @@ msgid "Original Filename"
msgstr "Nume de Fişier Original"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Nume de Dosar Original"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4222,10 +4224,6 @@ msgstr "text"
msgid "file"
msgstr "fișier"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "dosar"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Şir Caractere Sortare"
@@ -4574,6 +4572,12 @@ 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&rarr;Newest</small>"
msgstr "Sortează după Vârstă <small>Cel mai Vechi&rarr;Cel mai Nou</small>"
@@ -4943,16 +4947,16 @@ msgstr ""
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "Nu aveţi un furnizor usenet? Vă recomandăm să încercaţi %s."
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Eroare obţinere info TV (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Redenumire:%s în %s nereuşită"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Redenumire fişiere similare : %s în %s nereuşită"
@@ -5078,6 +5082,9 @@ 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"
@@ -5344,6 +5351,12 @@ msgstr "Descărcare URL nereuşită; %s"
#~ msgid "Enable if downloads are not put in their own folders."
#~ msgstr "Activează dacă descărcările nu sunt puse în dosarele lor."
#~ msgid "Original Foldername"
#~ msgstr "Nume de Dosar Original"
#~ msgid "folder"
#~ msgstr "dosar"
#~ msgid "Enable sorting and renaming of date named files."
#~ msgstr "Activează sortarea şi redenumirea fişierelor denumite după dată."

View File

@@ -2,15 +2,15 @@ msgid ""
msgstr ""
"Project-Id-Version: SABnzbd-0.7.x\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-10-25 23:30+0000\n"
"POT-Creation-Date: 2017-12-06 10: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-10-26 05:46+0000\n"
"X-Generator: Launchpad (build 18484)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
"Generated-By: pygettext.py 1.5\n"
#: SABnzbd.py [Error message]
@@ -551,6 +551,12 @@ 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"
@@ -751,7 +757,7 @@ msgstr "ч"
msgid "m"
msgstr "м"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "Не удаётся создать каталог %s"
@@ -781,6 +787,10 @@ 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
@@ -956,6 +966,7 @@ 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"
@@ -984,10 +995,6 @@ 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"
@@ -1098,11 +1105,6 @@ 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 ""
@@ -1544,10 +1546,6 @@ 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"
@@ -1568,7 +1566,7 @@ msgstr "Подробнее"
msgid "Post Processing Failed for %s (%s)"
msgstr "Ошибка пост-обработки для %s (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "см. журнал"
@@ -3469,7 +3467,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Число попыток"
@@ -4112,6 +4110,10 @@ msgstr "1x05 Эпизод Папка"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Эпизод Папка"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Название"
@@ -4181,8 +4183,8 @@ msgid "Original Filename"
msgstr "Исходное название файла"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Исходное название папки"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4200,10 +4202,6 @@ msgstr "текст"
msgid "file"
msgstr "файл"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "папка"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Строка сортировки"
@@ -4550,6 +4548,12 @@ 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&rarr;Newest</small>"
msgstr "Сортировать по возрасту <small>от старых к новым</small>"
@@ -4922,16 +4926,16 @@ msgstr ""
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "У вас ещё нет поставщика услуг Usenet? Рекомендуем попробовать %s."
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Не удалось получить сведения о ТВ (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Не удалось переименовать: %s в %s"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Не удалось переименовать похожий файл: %s в %s"
@@ -5032,6 +5036,9 @@ 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-файлы. Нельзя выполнить проверку или исправление"
@@ -5377,6 +5384,12 @@ msgstr "Не удалось загрузить URL: %s"
#~ msgid "Enable if downloads are not put in their own folders."
#~ msgstr "Включите, если загрузки не размещаются в собственных папках."
#~ msgid "Original Foldername"
#~ msgstr "Исходное название папки"
#~ msgid "folder"
#~ msgstr "папка"
#~ msgid "Enable sorting and renaming of date named files."
#~ msgstr "Позволяет сортировать и переименовывать файлы с датой в названии."

View File

@@ -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-10-25 23:30+0000\n"
"POT-Creation-Date: 2017-12-06 10: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-10-26 05:46+0000\n"
"X-Generator: Launchpad (build 18484)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -556,6 +556,12 @@ 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"
@@ -753,7 +759,7 @@ msgstr "с"
msgid "m"
msgstr "м"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "Немогуће креирати фасциклу %s"
@@ -783,6 +789,10 @@ 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
@@ -958,6 +968,7 @@ 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"
@@ -986,10 +997,6 @@ 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"
@@ -1099,11 +1106,6 @@ 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 поруке"
@@ -1538,10 +1540,6 @@ 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"
@@ -1562,7 +1560,7 @@ msgstr "Више"
msgid "Post Processing Failed for %s (%s)"
msgstr "Грешка пост-процесирања за %s (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "видети извештај"
@@ -3461,7 +3459,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Макс покушаја"
@@ -4098,6 +4096,10 @@ msgstr "1x05 Фасцикла епизоде"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Фасцикла епизоде"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Наслов"
@@ -4167,8 +4169,8 @@ msgid "Original Filename"
msgstr "Оригинално име датотеке"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Оригинално име фасцикле"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4186,10 +4188,6 @@ msgstr "текст"
msgid "file"
msgstr "датотека"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "фасцикла"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Уреди низ"
@@ -4537,6 +4535,12 @@ 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&rarr;Newest</small>"
msgstr "Среди по старост <small>Старије&rarr;Новије</small>"
@@ -4903,16 +4907,16 @@ msgstr ""
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "Немате 'usenet' провајдер? Препоручујемо Вам %s."
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Грешка преузимању ТВ инфо (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Неуспешно преименовање : %s у %s"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Неуспешно преименовање сличне датотеке: %s у %s"
@@ -5016,6 +5020,12 @@ msgstr "Погрешно учитавање УРЛ-а; %s"
#~ msgid "Enable sorting and renaming of date named files."
#~ msgstr "Упали сређивање и преименовање датотеке са датумом"
#~ msgid "folder"
#~ msgstr "фасцикла"
#~ msgid "Original Foldername"
#~ msgstr "Оригинално име фасцикле"
#~ msgid "Enable generic sorting and renaming of files."
#~ msgstr "Упали генерално сортирање/преименовање датотеке."
@@ -5272,6 +5282,9 @@ msgstr "Погрешно учитавање УРЛ-а; %s"
#~ msgid "Unpacking failed, these file(s) are missing:"
#~ msgstr "Неуспешан издвој, ове датотеке недостају:"
#~ msgid "Main packet not found..."
#~ msgstr "Главни пакет није нађен..."
#~ msgid "KB/s"
#~ msgstr "КБ/с"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-10-25 23:30+0000\n"
"POT-Creation-Date: 2017-12-06 10: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-10-26 05:46+0000\n"
"X-Generator: Launchpad (build 18484)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -556,6 +556,12 @@ 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"
@@ -757,7 +763,7 @@ msgstr "h"
msgid "m"
msgstr "m"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "Kan ej skapa mapp %s"
@@ -787,6 +793,10 @@ 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
@@ -962,6 +972,7 @@ 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"
@@ -990,10 +1001,6 @@ 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"
@@ -1104,11 +1111,6 @@ 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"
@@ -1549,10 +1551,6 @@ 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"
@@ -1573,7 +1571,7 @@ msgstr "Mer"
msgid "Post Processing Failed for %s (%s)"
msgstr "Efterbehandling misslyckades för %s (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "se loggfil"
@@ -3476,7 +3474,7 @@ msgstr ""
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr ""
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "Max antal omförsök"
@@ -4113,6 +4111,10 @@ msgstr "1x05 Episodmapp"
msgid "S01E05 Episode Folder"
msgstr "S01E05 Episodmapp"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "Titel"
@@ -4182,8 +4184,8 @@ msgid "Original Filename"
msgstr "Originalfilnamn"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "Ursprungliga mappnamnet"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4201,10 +4203,6 @@ msgstr "text"
msgid "file"
msgstr "fil"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "mapp"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "Sorteringssträng"
@@ -4551,6 +4549,12 @@ 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&rarr;Newest</small>"
msgstr "Sortera efter ålder <small>Äldst&rarr;Nyast</small>"
@@ -4922,16 +4926,16 @@ msgstr ""
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "Har du inte någon usenet leverantör? Vi rekommenderar att prova %s."
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "Det gick inte att hämta TV info (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "Det gick inte att döpa om: %s till %s"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "Det gick inte att döpa om liknande fil: %s till %s"
@@ -5027,6 +5031,9 @@ 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"
@@ -5461,6 +5468,12 @@ msgstr "URL hämtning misslyckades; %s"
#~ msgid "Groups / Indexer tags"
#~ msgstr "Grupper/Indexering-tagg"
#~ msgid "folder"
#~ msgstr "mapp"
#~ msgid "Original Foldername"
#~ msgstr "Ursprungliga mappnamnet"
#~ msgid "E.g. 119 or 563 for SSL"
#~ msgstr "T.ex. 119 eller 563 för SSL"

View File

@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: sabnzbd\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2017-10-25 23:30+0000\n"
"POT-Creation-Date: 2017-12-06 10: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-10-26 05:47+0000\n"
"X-Generator: Launchpad (build 18484)\n"
"X-Launchpad-Export-Date: 2017-12-07 05:31+0000\n"
"X-Generator: Launchpad (build 18511)\n"
#: SABnzbd.py [Error message]
msgid "Failed to start web-interface"
@@ -550,6 +550,12 @@ 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"
@@ -740,7 +746,7 @@ msgstr "小时"
msgid "m"
msgstr "分钟"
#: sabnzbd/misc.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/misc.py [Error message] # sabnzbd/sorting.py [Error message]
msgid "Cannot create directory %s"
msgstr "无法创建目录 %s"
@@ -770,6 +776,10 @@ 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
@@ -945,6 +955,7 @@ 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"
@@ -971,10 +982,6 @@ 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"
@@ -1084,11 +1091,6 @@ 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 消息"
@@ -1522,10 +1524,6 @@ 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"
@@ -1546,7 +1544,7 @@ msgstr "更多"
msgid "Post Processing Failed for %s (%s)"
msgstr "后期处理失败:%s (%s)"
#: sabnzbd/postproc.py
#: sabnzbd/postproc.py [Error message] # sabnzbd/postproc.py
msgid "see logfile"
msgstr "查看日志文件"
@@ -3406,7 +3404,7 @@ msgstr "SSL 加密算法"
msgid "Increase performance by forcing a lower SSL encryption strength."
msgstr "降低 SSL 的加密难度以便获得更高的性能。"
#: sabnzbd/skintext.py
#: sabnzbd/skintext.py # sabnzbd/urlgrabber.py
msgid "Maximum retries"
msgstr "最多重试次数"
@@ -4041,6 +4039,10 @@ msgstr "1x05 剧集文件夹"
msgid "S01E05 Episode Folder"
msgstr "S01E05 剧集文件夹"
#: sabnzbd/skintext.py
msgid "Job Name as Filename"
msgstr ""
#: sabnzbd/skintext.py
msgid "Title"
msgstr "标题"
@@ -4110,8 +4112,8 @@ msgid "Original Filename"
msgstr "原始文件名"
#: sabnzbd/skintext.py
msgid "Original Foldername"
msgstr "原始文件夹名"
msgid "Original Job Name"
msgstr ""
#: sabnzbd/skintext.py
msgid "Lower Case"
@@ -4129,10 +4131,6 @@ msgstr "text"
msgid "file"
msgstr "文件"
#: sabnzbd/skintext.py
msgid "folder"
msgstr "文件夹"
#: sabnzbd/skintext.py
msgid "Sort String"
msgstr "排序字串"
@@ -4477,6 +4475,12 @@ 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&rarr;Newest</small>"
msgstr "按发布时间排序 <small>最早&rarr;最新</small>"
@@ -4837,16 +4841,16 @@ msgstr "要从 usenet 下载您需要有一家提供商的访问权限。您的
msgid "Don't have a usenet provider? We recommend trying %s."
msgstr "还没有 usenet 提供商r? 我们推荐试试 %s。"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Error getting TV info (%s)"
msgstr "获取 TV 信息出错 (%s)"
#: sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message] # sabnzbd/tvsort.py [Error message]
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message] # sabnzbd/sorting.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename: %s to %s"
msgstr "重命名失败: %s 为 %s"
#: sabnzbd/tvsort.py [Error message]
#: sabnzbd/sorting.py [Error message]
msgid "Failed to rename similar file: %s to %s"
msgstr "重命名相似文件失败: %s 为 %s"
@@ -4943,6 +4947,9 @@ 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 文件无效,无法验证或修复"
@@ -5272,6 +5279,12 @@ msgstr "URL 装取失败; %s"
#~ msgid "Enable if downloads are not put in their own folders."
#~ msgstr "启用可将下载内容存放在各自的文件夹。"
#~ msgid "Original Foldername"
#~ msgstr "原始文件夹名"
#~ msgid "folder"
#~ msgstr "文件夹"
#~ msgid "Enable sorting and renaming of date named files."
#~ msgstr "启用按日期命名的文件的排序与重命名。"

View File

@@ -278,7 +278,7 @@ def initialize(pause_downloader=False, clean_up=False, evalSched=False, repair=0
sabnzbd.encoding.change_fsys(cfg.fsys_type())
# Set cache limit
if not cfg.cache_limit() or (cfg.cache_limit() == '200M' and (sabnzbd.WIN32 or sabnzbd.DARWIN)):
if not cfg.cache_limit() or (cfg.cache_limit() in ('200M', '450M') and (sabnzbd.WIN32 or sabnzbd.DARWIN)):
cfg.cache_limit.set(misc.get_cache_limit())
ArticleCache.do.new_limit(cfg.cache_limit.get_int())

View File

@@ -681,12 +681,11 @@ def _api_rescan(name, output, kwargs):
def _api_eval_sort(name, output, kwargs):
""" API: evaluate sorting expression """
import sabnzbd.tvsort
name = kwargs.get('name', '')
value = kwargs.get('value', '')
title = kwargs.get('title')
multipart = kwargs.get('movieextra', '')
path = sabnzbd.tvsort.eval_sort(value, title, name, multipart)
path = sabnzbd.sorting.eval_sort(value, title, name, multipart)
if path is None:
return report(output, _MSG_NOT_IMPLEMENTED)
else:
@@ -903,8 +902,8 @@ def _api_server_stats(name, output, kwargs):
stats['servers'] = {}
for svr in config.get_servers():
t, m, w, d, _ = BPSMeter.do.amounts(svr)
stats['servers'][svr] = {'total': t or 0, 'month': m or 0, 'week': w or 0, 'day': d or 0}
t, m, w, d, daily = BPSMeter.do.amounts(svr)
stats['servers'][svr] = {'total': t or 0, 'month': m or 0, 'week': w or 0, 'day': d or 0, 'daily': daily or {} }
return report(output, keyword='', data=stats)
@@ -1687,7 +1686,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, dec_limit=1)
header['speed'] = to_units(bytespersec, spaces=1)
header['mbleft'] = "%.2f" % (bytesleft / MEBI)
header['mb'] = "%.2f" % (bytes / MEBI)
header['sizeleft'] = format_bytes(bytesleft)

View File

@@ -82,23 +82,24 @@ class ArticleCache(object):
@synchronized(ARTICLE_LOCK)
def save_article(self, article, data):
nzf = article.nzf
nzo = nzf.nzo
if nzo.is_gone():
if article.nzf.nzo.is_gone():
# Do not discard this article because the
# file might still be processed at this moment!!
return
saved_articles = article.nzf.nzo.saved_articles
# Register article
if article not in article.nzf.nzo.saved_articles:
article.nzf.nzo.saved_articles.append(article)
if article not in saved_articles:
saved_articles.append(article)
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 self.__cache_limit:
if self.__cache_limit < 0:
self.__add_to_cache(article, data)
else:
data_size = len(data)

View File

@@ -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(save=False)
sabnzbd.downloader.Downloader.do.pause()
sabnzbd.emailer.diskfull()
# Abort all direct unpackers, just to be sure
sabnzbd.directunpacker.abort_all()
@@ -98,7 +98,7 @@ class Assembler(Thread):
filepath = self.assemble(nzf, filepath)
except IOError, (errno, strerror):
# If job was deleted or in active post-processing, ignore error
if not nzo.is_gone() and not nzo.pp_active:
if not nzo.deleted and not nzo.is_gone() and not nzo.pp_active:
# 28 == disk full => pause downloader
if errno == 28:
logging.error(T('Disk full! Forcing Pause'))
@@ -107,7 +107,7 @@ class Assembler(Thread):
# Log traceback
logging.info('Traceback: ', exc_info=True)
# Pause without saving
sabnzbd.downloader.Downloader.do.pause(save=False)
sabnzbd.downloader.Downloader.do.pause()
continue
except:
logging.error(T('Fatal error in Assembler'), exc_info=True)
@@ -371,5 +371,5 @@ def remove_warning_label(msg):
""" Standardize errors by removing obsolete
"WARNING:" part in all languages """
if ':' in msg:
return msg.split(':')[1]
return msg.split(':')[1].strip()
return msg

View File

@@ -51,7 +51,7 @@ RENAMES_FILE = '__renames__'
ATTRIB_FILE = 'SABnzbd_attrib'
REPAIR_REQUEST = 'repair-all.sab'
SABYENC_VERSION_REQUIRED = '3.3.1'
SABYENC_VERSION_REQUIRED = '3.3.2'
DB_HISTORY_VERSION = 1
DB_HISTORY_NAME = 'history%s.db' % DB_HISTORY_VERSION
@@ -74,9 +74,11 @@ DEF_WORKDIR = 'sabnzbd'
DEF_LOG_FILE = 'sabnzbd.log'
DEF_LOG_ERRFILE = 'sabnzbd.error.log'
DEF_LOG_CHERRY = 'cherrypy.log'
DEF_CACHE_LIMIT = '450M'
DEF_ARTICLE_CACHE_DEFAULT = '500M'
DEF_ARTICLE_CACHE_MAX = '1G'
DEF_TIMEOUT = 60
DEF_SCANRATE = 5
MAX_URL_RETRIES = 10
MAX_DECODE_QUEUE = 10
LIMIT_DECODE_QUEUE = 100
MAX_WARNINGS = 20

View File

@@ -48,8 +48,8 @@ try:
import sabyenc
SABYENC_ENABLED = True
SABYENC_VERSION = sabyenc.__version__
# Verify version
if SABYENC_VERSION != SABYENC_VERSION_REQUIRED:
# Verify version to at least match minor version
if SABYENC_VERSION[:3] != SABYENC_VERSION_REQUIRED[:3]:
raise ImportError
except ImportError:
SABYENC_ENABLED = False
@@ -131,8 +131,7 @@ class Decoder(Thread):
logging.info("Traceback: ", exc_info=True)
sabnzbd.downloader.Downloader.do.pause()
article.fetcher = None
sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(nzf, nzo)
sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(article)
register = False
except MemoryError, e:
@@ -143,8 +142,7 @@ class Decoder(Thread):
logging.info("Traceback: ", exc_info=True)
sabnzbd.downloader.Downloader.do.pause()
article.fetcher = None
sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(nzf, nzo)
sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(article)
register = False
except CrcError, e:
@@ -316,10 +314,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.nzf, article.nzf.nzo)
sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(article, article_reset=False)
return True
msg = T('%s => missing from all servers, discarding') % article
@@ -337,7 +335,7 @@ class Decoder(Thread):
return
# Set the md5-of-16k if this is the first article
if article.partnum == nzf.lowest_partnum:
if article.lowest_partnum:
nzf.md5of16k = hashlib.md5(decoded_data[:16384]).digest()
# Try the rename

View File

@@ -270,7 +270,7 @@ class Downloader(Thread):
self.paused = False
@NzbQueueLocker
def pause(self, save=True):
def pause(self):
""" Pause the downloader, optionally saving admin """
if not self.paused:
self.paused = True
@@ -280,8 +280,6 @@ class Downloader(Thread):
BPSMeter.do.reset()
if cfg.autodisconnect():
self.disconnect()
if save:
ArticleCache.do.flush_articles()
def delay(self):
logging.debug("Delaying")
@@ -794,11 +792,8 @@ 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.nzf, article.nzf.nzo)
sabnzbd.nzbqueue.NzbQueue.do.reset_try_lists(article)
if destroy:
nw.terminate(quit=quit)

View File

@@ -20,6 +20,7 @@ sabnzbd.encoding - Unicoded filename support
"""
import locale
import string
from xml.sax.saxutils import escape
from Cheetah.Filters import Filter
@@ -110,7 +111,6 @@ def unicoder(p, force=False):
def xml_name(p, keep_escape=False, encoding=None):
""" Prepare name for use in HTML/XML contect """
if isinstance(p, unicode):
pass
elif isinstance(p, str):
@@ -171,10 +171,10 @@ class EmailFilter(Filter):
################################################################################
#
# Map CodePage-850 characters to Python's pseudo-Unicode 8bit ASCII
#
# Use to transform 8-bit console output to plain Python strings
# For example for unrar and par2 output
#
import string
TAB_850 = \
"\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F" \
"\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F" \
@@ -187,7 +187,7 @@ TAB_850 = \
TAB_LATIN = \
"\xC7\xFC\xE9\xE2\xE4\xE0\xE5\xE7\xEA\xEB\xE8\xEF\xEE\xEC\xC4\xC5" \
"\xC9\xE6\xC6\xF4\xF6\xF2\xFB\xF9\xFF\xD6\xDC\xF8\xA3\xD8\xD7\x66" \
"\xC9\xE6\xC6\xF4\xF6\xF2\xFB\xF9\xFF\xD6\xDC\xF8\xA3\xD8\xD7\x83" \
"\xE1\xED\xF3\xFA\xF1\xD1\xAA\xBA\xBF\xAE\xAC\xDB\xBC\xA1\xAB\xBB" \
"\x7E\x7E\x7E\x7E\x7E\xC1\xC2\xC0\xA9\x7E\x7E\x7E\x7E\xA2\xA5\x7E" \
"\x7E\x7E\x7E\x7E\x7E\x7E\xE3\xc3\x7E\x7E\x7E\x7E\x7E\x7E\x7E\xA4" \
@@ -195,18 +195,14 @@ TAB_LATIN = \
"\xD3\xDF\xD4\xD2\xF5\xD5\xB5\xFE\xDE\xDA\xDB\xD9\xFD\xDD\xAF\xB4" \
"\xAD\xB1\x5F\xBE\xB6\xA7\xF7\xB8\xB0\xA8\xB7\xB9\xB3\xB2\x7E\xA0"
gTABLE_850_LATIN = string.maketrans(TAB_850, TAB_LATIN)
gTABLE_LATIN_850 = string.maketrans(TAB_LATIN, TAB_850)
def TRANS(p):
""" For Windows: Translate CP850 to Python's Latin-1 and return in Unicode
Others: return original string
"""
global gTABLE_850_LATIN
if sabnzbd.WIN32:
if p:
return p.translate(gTABLE_850_LATIN).decode('cp1252', 'replace')
return p.translate(string.maketrans(TAB_850, TAB_LATIN)).decode('cp1252', 'replace')
else:
# translate() fails on empty or None strings
return ''
@@ -214,21 +210,6 @@ def TRANS(p):
return unicoder(p)
def UNTRANS(p):
""" For Windows: Translate Python's Latin-1 to CP850
Others: return original string
"""
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 ''
else:
return p
def fixup_ff4(p):
""" Fix incompatibility between CherryPy and Firefox-4 on OSX,
where a filename contains &#xx; encodings
@@ -300,7 +281,7 @@ def deunicode(p):
except:
return p
else:
return p
return str(p)
auto_fsys()

View File

@@ -24,6 +24,7 @@ import sys
import logging
import urllib
import re
import ctypes
import shutil
import threading
import subprocess
@@ -39,7 +40,7 @@ from urlparse import urlparse
import sabnzbd
from sabnzbd.decorators import synchronized
from sabnzbd.constants import DEFAULT_PRIORITY, FUTURE_Q_FOLDER, JOB_ADMIN, \
GIGI, MEBI, DEF_CACHE_LIMIT
GIGI, MEBI, DEF_ARTICLE_CACHE_DEFAULT, DEF_ARTICLE_CACHE_MAX
import sabnzbd.config as config
import sabnzbd.cfg as cfg
from sabnzbd.encoding import unicoder, special_fixer, gUTF
@@ -738,12 +739,12 @@ def from_units(val):
return 0.0
def to_units(val, spaces=0, dec_limit=2, postfix=''):
def to_units(val, spaces=0, postfix=''):
""" Convert number to K/M/G/T/P notation
Add "spaces" if not ending in letter
dig_limit==1 show single decimal for M and higher
dig_limit==2 show single decimal for G and higher
Show single decimal for M and higher
"""
dec_limit = 1
decimals = 0
if val < 0:
sign = '-'
@@ -875,27 +876,74 @@ def check_mount(path):
def get_cache_limit():
""" Depending on OS, calculate cache limit """
# OSX/Windows use Default value
if sabnzbd.WIN32 or sabnzbd.DARWIN:
return DEF_CACHE_LIMIT
""" Depending on OS, calculate cache limits.
In ArticleCache it will make sure we stay
within system limits for 32/64 bit
"""
# Calculate, if possible
try:
if sabnzbd.WIN32:
# Windows
mem_bytes = get_windows_memory()
elif sabnzbd.DARWIN:
# macOS
mem_bytes = get_darwin_memory()
else:
# Linux
mem_bytes = (os.sysconf('SC_PAGE_SIZE') * os.sysconf('SC_PHYS_PAGES'))
# Use 1/4th of available memory
mem_bytes = (os.sysconf('SC_PAGE_SIZE') * os.sysconf('SC_PHYS_PAGES'))/4
# Not more than the maximum we think is reasonable
if mem_bytes > from_units(DEF_CACHE_LIMIT):
return DEF_CACHE_LIMIT
elif mem_bytes > from_units('32M'):
# We make sure it's at least a valid value
mem_bytes = mem_bytes/4
# We don't want to set a value that's too high
if mem_bytes > from_units(DEF_ARTICLE_CACHE_MAX):
return DEF_ARTICLE_CACHE_MAX
# We make sure it's at least a valid value
if mem_bytes > from_units('32M'):
return to_units(mem_bytes)
except:
pass
# If failed, leave empty so user needs to decide
# Always at least minimum on Windows/macOS
if sabnzbd.WIN32 and sabnzbd.DARWIN:
return DEF_ARTICLE_CACHE_DEFAULT
# If failed, leave empty for Linux so user needs to decide
return ''
def get_windows_memory():
""" Use ctypes to extract available memory """
class MEMORYSTATUSEX(ctypes.Structure):
_fields_ = [
("dwLength", ctypes.c_ulong),
("dwMemoryLoad", ctypes.c_ulong),
("ullTotalPhys", ctypes.c_ulonglong),
("ullAvailPhys", ctypes.c_ulonglong),
("ullTotalPageFile", ctypes.c_ulonglong),
("ullAvailPageFile", ctypes.c_ulonglong),
("ullTotalVirtual", ctypes.c_ulonglong),
("ullAvailVirtual", ctypes.c_ulonglong),
("sullAvailExtendedVirtual", ctypes.c_ulonglong),
]
def __init__(self):
# have to initialize this to the size of MEMORYSTATUSEX
self.dwLength = ctypes.sizeof(self)
super(MEMORYSTATUSEX, self).__init__()
stat = MEMORYSTATUSEX()
ctypes.windll.kernel32.GlobalMemoryStatusEx(ctypes.byref(stat))
return stat.ullTotalPhys
def get_darwin_memory():
""" Use system-call to extract total memory on macOS """
system_output = sabnzbd.newsunpack.run_simple(['sysctl', 'hw.memsize'])
return float(system_output.split()[1])
##############################################################################
# Locked directory operations to avoid problems with simultaneous add/remove
##############################################################################

View File

@@ -29,12 +29,12 @@ import binascii
import shutil
import sabnzbd
from sabnzbd.encoding import TRANS, UNTRANS, unicoder, platform_encode, deunicode
from sabnzbd.encoding import TRANS, unicoder, platform_encode, deunicode
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
from sabnzbd.tvsort import SeriesSorter
from sabnzbd.sorting import SeriesSorter
import sabnzbd.cfg as cfg
from sabnzbd.constants import Status
@@ -110,7 +110,6 @@ 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:
@@ -268,16 +267,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 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:
@@ -288,6 +277,20 @@ 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:
@@ -1013,7 +1016,7 @@ def seven_extract_core(sevenset, extensions, extraction_path, one_folder, delete
parm = '-tsplit'
else:
name = sevenset
parm = '-t7z'
parm = '-tzip' if sevenset.lower().endswith('.zip') else '-t7z'
if not os.path.exists(name):
return 1, T('7ZIP set "%s" is incomplete, cannot unpack') % unicoder(sevenset)
@@ -1090,6 +1093,7 @@ 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][:]:
# Make sure we only get new par2 files
if extrapar not in nzo.finished_files and extrapar not in nzo.files:
nzo.add_parfile(extrapar)
readd = True
@@ -1308,8 +1312,10 @@ 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,
logging.info(T('Main packet 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)
logging.info("Extra pars = %s", nzo.extrapars[setname])
# Look for the smallest par2file
@@ -1327,7 +1333,6 @@ 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)
@@ -1451,6 +1456,15 @@ 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)
@@ -1485,6 +1499,10 @@ 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
@@ -1522,6 +1540,8 @@ def MultiPar_Verify(parfile, parfile_nzf, nzo, setname, joinables, single=False)
# 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
@@ -1605,8 +1625,10 @@ 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,
logging.info(T('Main packet 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)
logging.info("Extra pars = %s", nzo.extrapars[setname])
# Look for the smallest par2file
@@ -1624,7 +1646,6 @@ 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)
@@ -1837,9 +1858,21 @@ 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
@@ -1879,7 +1912,7 @@ 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()] = field_value
except:
# Catch key/unicode errors
pass
@@ -1888,7 +1921,7 @@ def create_env(nzo=None, extra_env_fields=None):
for field in extra_env_fields:
try:
if extra_env_fields[field] is not None:
env['SAB_' + field.upper()] = str(extra_env_fields[field])
env['SAB_' + field.upper()] = extra_env_fields[field]
else:
env['SAB_' + field.upper()] = ''
except:
@@ -2255,14 +2288,14 @@ def pre_queue(name, pp, cat, script, priority, size, groups):
def fix(p):
if not p or str(p).lower() == 'none':
return ''
else:
return UNTRANS(str(p))
return unicoder(p)
values = [1, name, pp, cat, script, priority, None]
script_path = make_script_path(cfg.pre_script())
if script_path:
command = [script_path, name, fix(pp), fix(cat), fix(script), fix(priority), str(size), ' '.join(groups)]
command = [script_path, name, pp, cat, script, priority, str(size), ' '.join(groups)]
command.extend(analyse_show(name))
command = [fix(arg) for arg in command]
try:
stup, need_shell, command, creationflags = build_command(command)
@@ -2283,7 +2316,7 @@ def pre_queue(name, pp, cat, script, priority, size, groups):
for line in output.split('\n'):
line = line.strip('\r\n \'"')
if n < len(values) and line:
values[n] = TRANS(line)
values[n] = deunicode(line)
n += 1
accept = int_conv(values[0])
if accept < 1:
@@ -2302,10 +2335,8 @@ def list2cmdline(lst):
for arg in lst:
if not arg:
nlst.append('""')
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)
nlst.append('"%s"' % arg)
return ' '.join(nlst)

View File

@@ -134,14 +134,16 @@ def get_prio(gtype, section):
def check_cat(section, job_cat, keyword=None):
""" Check if `job_cat` is enabled in `section`. * = All """
""" Check if `job_cat` is enabled in `section`.
* = All, if no other categories selected.
"""
if not job_cat:
return True
try:
if not keyword:
keyword = section
section_cats = sabnzbd.config.get_config(section, '%s_cats' % keyword)()
return ('*' in section_cats or job_cat in section_cats)
return (['*'] == section_cats or job_cat in section_cats)
except TypeError:
logging.debug('Incorrect Notify option %s:%s_cats', section, section)
return True

View File

@@ -342,7 +342,8 @@ class NzbQueue(object):
nzo.set_final_name_pw(name, password)
else:
# Reset url fetch wait time
nzo.wait = None
nzo.url_wait = None
nzo.url_tries = 0
return True
else:
return False
@@ -713,11 +714,13 @@ class NzbQueue(object):
except:
return -1
def reset_try_lists(self, nzf=None, nzo=None):
if nzf:
nzf.reset_try_list()
if nzo:
nzo.reset_try_list()
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_all_try_lists(self):
for nzo in self.__nzo_list:

View File

@@ -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, remove_file, remove_dir, caller_name
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', 'nzf'
'article', 'art_id', 'bytes', 'partnum', 'lowest_partnum', 'nzf'
)
@@ -128,6 +128,7 @@ 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
@@ -269,7 +270,23 @@ class NzbFile(TryList):
self.valid = bool(article_db)
if self.valid and self.nzf_id:
sabnzbd.save_data(article_db, self.nzf_id, nzo.workpath)
# 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
def finish_import(self):
""" Load the article objects from disk """
@@ -277,22 +294,21 @@ class NzbFile(TryList):
article_db = sabnzbd.load_data(self.nzf_id, self.nzo.workpath, remove=False)
if article_db:
for partnum in article_db:
art_id = article_db[partnum][0]
bytes = article_db[partnum][1]
self.add_article(article_db[partnum], partnum)
article = Article(art_id, bytes, partnum, self)
self.articles.append(article)
self.decodetable[partnum] = article
# 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
# 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)
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
def remove_article(self, article, found):
""" Handle completed article, possibly end of file """
@@ -329,11 +345,6 @@ 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:
@@ -562,7 +573,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',
'duplicate', 'oversized', 'precheck', 'incomplete', 'reuse', 'meta', 'first_articles',
'md5sum', 'servercount', 'unwanted_ext', 'renames', 'rating_filtered'
)
@@ -606,6 +617,10 @@ class NzbObject(TryList):
# In case only /password was entered for nzbname
work_name = filename
# Check for password also in filename
if not password:
dummy, password = scan_password(os.path.splitext(filename)[0])
# Remove trailing .nzb and .par(2)
self.work_name = create_work_name(work_name)
self.final_name = create_work_name(work_name)
@@ -650,6 +665,7 @@ class NzbObject(TryList):
self.avg_bps_freq = 0
self.avg_bps_total = 0
self.first_articles = []
self.saved_articles = []
self.nzo_id = None
@@ -689,7 +705,8 @@ class NzbObject(TryList):
self.next_save = None
self.save_timeout = None
self.encrypted = 0
self.wait = None
self.url_wait = None
self.url_tries = 0
self.pp_active = False # Signals active post-processing (not saved)
self.md5sum = None
@@ -806,27 +823,36 @@ class NzbObject(TryList):
# Run user pre-queue script if needed
if not reuse and cfg.pre_script():
accept, name, pp, cat, script, priority, group = \
accept, name, pp, cat_pp, script_pp, 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 accept < 1:
self.purge_data()
raise TypeError
if name:
self.set_final_name_pw(name)
if script_pp:
script = script_pp
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)
@@ -877,37 +903,8 @@ class NzbObject(TryList):
if reuse:
self.check_existing_files(wdir)
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')
# Perform sorting
self.sort_nzfs()
# Copy meta fields to nzo_info, if not already set
for kw in self.meta:
@@ -951,6 +948,42 @@ 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()
@@ -987,6 +1020,9 @@ 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 """
@@ -1099,8 +1135,23 @@ 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]:
@@ -1260,8 +1311,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.wait, float):
dif = int(self.wait - time.time() + 0.5)
if isinstance(self.url_wait, float):
dif = int(self.url_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:
@@ -1418,7 +1469,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, dec_limit=1))
msg1 = T('Downloaded in %s at an average of %sB/s') % (complete_time, to_units(avg_bps * 1024))
msg1 += u'<br/>' + T('Age') + ': ' + calc_age(self.avg_date, True)
bad = self.nzo_info.get('bad_articles', 0)
@@ -1458,29 +1509,38 @@ class NzbObject(TryList):
article = None
nzf_remove_list = []
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:
continue
# 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
article = nzf.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:
continue
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:
@@ -1591,6 +1651,14 @@ 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)
@@ -1651,6 +1719,8 @@ class NzbObject(TryList):
@synchronized(NZO_LOCK)
def purge_data(self, keep_basic=False, del_files=False):
""" Remove all admin info, 'keep_basic' preserves attribs and nzb """
logging.info('[%s] Purging data for job %s (keep_basic=%s, del_files=%s)', caller_name(), self.final_name, keep_basic, del_files)
wpath = self.workpath
for nzf in self.files:
sabnzbd.remove_data(nzf.nzf_id, wpath)
@@ -1676,6 +1746,7 @@ class NzbObject(TryList):
try:
remove_dir(self.downpath)
except:
logging.debug('Folder not removed: %s', self.downpath)
pass
def gather_info(self, full=False):
@@ -1816,7 +1887,8 @@ class NzbObject(TryList):
# Set non-transferable values
self.pp_active = False
self.avg_stamp = time.mktime(self.avg_date.timetuple())
self.wait = None
self.url_wait = None
self.url_tries = 0
self.to_be_removed = False
self.direct_unpacker = None
if self.meta is None:

View File

@@ -461,7 +461,7 @@ class SABnzbdDelegate(NSObject):
self.setMenuTitle_("")
elif bytes_left > 0:
self.state = ""
speed = to_units(bpsnow, dec_limit=1)
speed = to_units(bpsnow)
# "10.1 MB/s" doesn't fit, remove space char
if 'M' in speed and len(speed) > 5:
speed = speed.replace(' ', '')

View File

@@ -35,7 +35,7 @@ from sabnzbd.misc import real_path, get_unique_path, create_dirs, move_to_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
from sabnzbd.tvsort import Sorter
from sabnzbd.sorting import Sorter
from sabnzbd.constants import REPAIR_PRIORITY, TOP_PRIORITY, POSTPROC_QUEUE_FILE_NAME, \
POSTPROC_QUEUE_VERSION, sample_match, JOB_ADMIN, Status, VERIFIED_FILE
from sabnzbd.encoding import TRANS, unicoder
@@ -51,6 +51,8 @@ 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)
@@ -67,15 +69,26 @@ class PostProcessor(Thread):
if self.history_queue is None:
self.history_queue = []
self.queue = Queue.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
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")
@@ -115,7 +128,12 @@ class PostProcessor(Thread):
""" Push on finished job in the queue """
if nzo not in self.history_queue:
self.history_queue.append(nzo)
self.queue.put(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.save()
sabnzbd.history_updated()
@@ -131,7 +149,8 @@ class PostProcessor(Thread):
def stop(self):
""" Stop thread after finishing running job """
self.__stop = True
self.queue.put(None)
self.slow_queue.put(None)
self.fast_queue.put(None)
def cancel_pp(self, nzo_id):
""" Change the status, so that the PP is canceled """
@@ -145,7 +164,7 @@ class PostProcessor(Thread):
def empty(self):
""" Return True if pp queue is empty """
return self.queue.empty() and not self.__busy
return self.slow_queue.empty() and self.fast_queue.empty() and not self.__busy
def get_queue(self):
""" Return list of NZOs that still need to be processed """
@@ -174,6 +193,11 @@ class PostProcessor(Thread):
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:
@@ -183,15 +207,28 @@ class PostProcessor(Thread):
time.sleep(5)
continue
# Something in the fast queue?
try:
nzo = self.queue.get(timeout=1)
# 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
except Queue.Empty:
if check_eoq:
check_eoq = False
handle_empty_queue()
# 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!
continue
else:
nzo = self.queue.get()
# Stop job
if not nzo:
@@ -247,7 +284,6 @@ def process_job(nzo):
postproc_time = 0
script_log = ''
script_line = ''
crash_msg = ''
# Get the job flags
nzo.save_attribs()
@@ -504,15 +540,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, 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)
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')
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)
@@ -853,10 +889,14 @@ 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):
cont = os.listdir(folder)
if len(cont) == 1:
folder = os.path.join(folder, cont[0])
folder = one_file_or_folder(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
return folder

View File

@@ -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, dec_limit=1)
speed = to_units(bpsnow, dec_limit=1)
mb_left = to_units(bytes_left)
speed = to_units(bpsnow)
if self.sabpaused:
self.hover_text = self.txt_paused

View File

@@ -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, dec_limit=1)
speed = to_units(bpsnow, dec_limit=1)
mb_left = to_units(bytes_left)
speed = to_units(bpsnow)
if self.sabpaused:
self.tooltip = T('Paused')

View File

@@ -712,6 +712,7 @@ SKIN_TEXT = {
'button-SeasonS01E05' : TT('S01E05 Season Folder'),
'button-Ep1x05' : TT('1x05 Episode Folder'),
'button-EpS01E05' : TT('S01E05 Episode Folder'),
'button-FileLikeFolder' : TT('Job Name as Filename'),
'sort-title' : TT('Title'),
'movie-sp-name' : TT('Movie Name'),
'movie-dot-name' : TT('Movie.Name'),
@@ -731,12 +732,11 @@ SKIN_TEXT = {
'partNumber' : TT('Part Number'),
'decade' : TT('Decade'),
'orgFilename' : TT('Original Filename'),
'orgDirname' : TT('Original Foldername'),
'orgJobname' : TT('Original Job Name'),
'lowercase' : TT('Lower Case'),
'TEXT' : TT('TEXT'),
'text' : TT('text'),
'sort-File' : TT('file'),
'sort-Folder' : TT('folder'),
'sortString' : TT('Sort String'),
'multiPartLabel' : TT('Multi-part label'),
'button-inFolders' : TT('In folders'),
@@ -862,6 +862,7 @@ 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&rarr;Newest</small>'),
'Glitter-sortAgeDesc' : TT('Sort by Age <small>Newest&rarr;Oldest</small>'),
'Glitter-sortNameAsc' : TT('Sort by Name <small>A&rarr;Z</small>'),

View File

@@ -16,7 +16,7 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
"""
sabnzbd.tvsort - Sorting Functions
sabnzbd.sorting - Sorting Functions
Series Sorting - Sorting downloads into seasons & episodes
Date Sorting - Sorting downloads by a custom date matching
Generic Sorting - Sorting large files by a custom matching
@@ -101,23 +101,23 @@ class Sorter(object):
self.cat = cat
self.ext = ''
def detect(self, dirname, complete_dir):
def detect(self, job_name, complete_dir):
""" Detect which kind of sort applies """
self.sorter = SeriesSorter(self.nzo, dirname, complete_dir, self.cat)
self.sorter = SeriesSorter(self.nzo, job_name, complete_dir, self.cat)
if self.sorter.matched:
complete_dir = self.sorter.get_final_path()
self.type = 'tv'
self.sort_file = True
return complete_dir
self.sorter = DateSorter(self.nzo, dirname, complete_dir, self.cat)
self.sorter = DateSorter(self.nzo, job_name, complete_dir, self.cat)
if self.sorter.matched:
complete_dir = self.sorter.get_final_path()
self.type = 'date'
self.sort_file = True
return complete_dir
self.sorter = GenericSorter(self.nzo, dirname, complete_dir, self.cat)
self.sorter = MovieSorter(self.nzo, job_name, complete_dir, self.cat)
if self.sorter.matched:
complete_dir = self.sorter.get_final_path()
self.type = 'movie'
@@ -177,10 +177,10 @@ class Sorter(object):
class SeriesSorter(object):
""" Methods for Series Sorting """
def __init__(self, nzo, dirname, path, cat):
def __init__(self, nzo, job_name, path, cat):
self.matched = False
self.original_dirname = dirname
self.original_job_name = job_name
self.original_path = path
self.nzo = nzo
self.cat = cat
@@ -205,9 +205,9 @@ class SeriesSorter(object):
if force or (cfg.enable_tv_sorting() and cfg.tv_sort_string()):
if force or (not self.cats) or (self.cat and self.cat.lower() in self.cats) or (not self.cat and 'None' in self.cats):
# First check if the show matches TV episode regular expressions. Returns regex match object
self.match_obj, self.extras = check_regexs(self.original_dirname, series_match)
self.match_obj, self.extras = check_regexs(self.original_job_name, series_match)
if self.match_obj:
logging.debug("Found TV Show (%s)", self.original_dirname)
logging.debug("Found TV Show (%s)", self.original_job_name)
self.matched = True
def is_match(self):
@@ -223,7 +223,7 @@ class SeriesSorter(object):
return self.final_path
else:
# Error Sorting
return os.path.join(self.original_path, self.original_dirname)
return os.path.join(self.original_path, self.original_job_name)
def get_multi_ep_naming(self, one, two, extras):
""" Returns a list of unique values joined into a string and separated by - (ex:01-02-03-04) """
@@ -242,8 +242,8 @@ class SeriesSorter(object):
def get_shownames(self):
""" Get the show name from the match object and format it """
# Get the formatted title and alternate title formats
self.show_info['show_tname'], self.show_info['show_tname_two'], self.show_info['show_tname_three'] = get_titles(self.nzo, self.match_obj, self.original_dirname, True)
self.show_info['show_name'], self.show_info['show_name_two'], self.show_info['show_name_three'] = get_titles(self.nzo, self.match_obj, self.original_dirname)
self.show_info['show_tname'], self.show_info['show_tname_two'], self.show_info['show_tname_three'] = get_titles(self.nzo, self.match_obj, self.original_job_name, True)
self.show_info['show_name'], self.show_info['show_name_two'], self.show_info['show_name_three'] = get_titles(self.nzo, self.match_obj, self.original_job_name)
def get_seasons(self):
""" Get the season number from the match object and format it """
@@ -289,7 +289,7 @@ class SeriesSorter(object):
def get_showdescriptions(self):
""" Get the show descriptions from the match object and format them """
self.show_info['ep_name'], self.show_info['ep_name_two'], self.show_info['ep_name_three'] = get_descriptions(self.nzo, self.match_obj, self.original_dirname)
self.show_info['ep_name'], self.show_info['ep_name_two'], self.show_info['ep_name_three'] = get_descriptions(self.nzo, self.match_obj, self.original_job_name)
def get_values(self):
""" Collect and construct all the values needed for path replacement """
@@ -309,7 +309,7 @@ class SeriesSorter(object):
return True
except:
logging.error(T('Error getting TV info (%s)'), clip_path(self.original_dirname))
logging.error(T('Error getting TV info (%s)'), clip_path(self.original_job_name))
logging.info("Traceback: ", exc_info=True)
return False
@@ -338,7 +338,7 @@ class SeriesSorter(object):
mapping.append(('%0s', self.show_info['season_num_alt']))
# Original dir name
mapping.append(('%dn', self.original_dirname))
mapping.append(('%dn', self.original_job_name))
# Replace episode names
if self.show_info['ep_name']:
@@ -428,9 +428,9 @@ class SeriesSorter(object):
_RE_MULTIPLE = (
re.compile(r'cd\W?(\d+)\W?', re.I), # .cd1.avi
re.compile(r'\w\W?([\w\d])[{}]*$', re.I), # blah1.avi blaha.avi
re.compile(r'\w\W([\w\d])\W', re.I) # blah-1-ok.avi blah-a-ok.avi
re.compile(r'cd\W?(\d+)\W?', re.I), # .cd1.mkv
re.compile(r'\w\W?([\w\d])[{}]*$', re.I), # blah1.mkv blaha.mkv
re.compile(r'\w\W([\w\d])\W', re.I) # blah-1-ok.mkv blah-a-ok.mkv
)
@@ -448,7 +448,7 @@ def check_for_sequence(regex, files):
matches = {}
prefix = None
# Build up a dictionary of matches
# The key is based off the match, ie {1:'blah-part1.avi'}
# The key is based off the match, ie {1:'blah-part1.mkv'}
for _file in files:
name, ext = os.path.splitext(_file)
match1 = regex.search(name)
@@ -483,7 +483,7 @@ def check_for_sequence(regex, files):
else:
passed = False
if passed:
# convert {'b':'filename-b.avi'} to {'2', 'filename-b.avi'}
# convert {'b':'filename-b.mkv'} to {'2', 'filename-b.mkv'}
item = matches.pop(akey)
matches[str(key)] = item
@@ -493,13 +493,13 @@ def check_for_sequence(regex, files):
return {}
class GenericSorter(object):
class MovieSorter(object):
""" Methods for Generic Sorting """
def __init__(self, nzo, dirname, path, cat):
def __init__(self, nzo, job_name, path, cat):
self.matched = False
self.original_dirname = dirname
self.original_job_name = job_name
self.original_path = path
self.sort_string = cfg.movie_sort_string()
self.extra = cfg.movie_sort_extra()
@@ -524,7 +524,7 @@ class GenericSorter(object):
if force or (cfg.enable_movie_sorting() and self.sort_string):
# First check if the show matches TV episode regular expressions. Returns regex match object
if force or (self.cat and self.cat.lower() in self.cats) or (not self.cat and 'None' in self.cats):
logging.debug("Found Movie (%s)", self.original_dirname)
logging.debug("Found Movie (%s)", self.original_job_name)
self.matched = True
def get_final_path(self):
@@ -536,7 +536,7 @@ class GenericSorter(object):
return self.final_path
else:
# Error Sorting
return os.path.join(self.original_path, self.original_dirname)
return os.path.join(self.original_path, self.original_job_name)
def get_values(self):
""" Collect and construct all the values needed for path replacement """
@@ -548,13 +548,13 @@ class GenericSorter(object):
if year:
year_m = None
else:
dirname = self.original_dirname.replace('_', ' ')
job_name = self.original_job_name.replace('_', ' ')
RE_YEAR = re.compile(year_match, re.I)
year_m = RE_YEAR.search(dirname)
year_m = RE_YEAR.search(job_name)
if year_m:
# Find the last matched date
# Keep year_m to use in get_titles
year = RE_YEAR.findall(dirname)[-1][0]
year = RE_YEAR.findall(job_name)[-1][0]
else:
year = ''
self.movie_info['year'] = year
@@ -563,8 +563,8 @@ class GenericSorter(object):
self.movie_info['decade'], self.movie_info['decade_two'] = get_decades(year)
# - Get Title
self.movie_info['ttitle'], self.movie_info['ttitle_two'], self.movie_info['ttitle_three'] = get_titles(self.nzo, year_m, self.original_dirname, True)
self.movie_info['title'], self.movie_info['title_two'], self.movie_info['title_three'] = get_titles(self.nzo, year_m, self.original_dirname)
self.movie_info['ttitle'], self.movie_info['ttitle_two'], self.movie_info['ttitle_three'] = get_titles(self.nzo, year_m, self.original_job_name, True)
self.movie_info['title'], self.movie_info['title_two'], self.movie_info['title_three'] = get_titles(self.nzo, year_m, self.original_job_name)
return True
@@ -605,7 +605,7 @@ class GenericSorter(object):
mapping.append(('%0decade', self.movie_info['decade_two']))
# Original dir name
mapping.append(('%dn', self.original_dirname))
mapping.append(('%dn', self.original_job_name))
path = path_subst(sorter, mapping)
@@ -698,10 +698,10 @@ class GenericSorter(object):
class DateSorter(object):
""" Methods for Date Sorting """
def __init__(self, nzo, dirname, path, cat):
def __init__(self, nzo, job_name, path, cat):
self.matched = False
self.original_dirname = dirname
self.original_job_name = job_name
self.original_path = path
self.sort_string = cfg.date_sort_string()
self.cats = cfg.date_categories()
@@ -726,9 +726,9 @@ class DateSorter(object):
if force or (cfg.enable_date_sorting() and self.sort_string):
# First check if the show matches TV episode regular expressions. Returns regex match object
if force or (self.cat and self.cat.lower() in self.cats) or (not self.cat and 'None' in self.cats):
self.match_obj, self.date_type = check_for_date(self.original_dirname, date_match)
self.match_obj, self.date_type = check_for_date(self.original_job_name, date_match)
if self.match_obj:
logging.debug("Found date for sorting (%s)", self.original_dirname)
logging.debug("Found date for sorting (%s)", self.original_job_name)
self.matched = True
def is_match(self):
@@ -744,7 +744,7 @@ class DateSorter(object):
return self.final_path
else:
# Error Sorting
return os.path.join(self.original_path, self.original_dirname)
return os.path.join(self.original_path, self.original_job_name)
def get_values(self):
""" Collect and construct all the values needed for path replacement """
@@ -767,10 +767,10 @@ class DateSorter(object):
self.date_info['decade'], self.date_info['decade_two'] = get_decades(self.date_info['year'])
# - Get Title
self.date_info['ttitle'], self.date_info['ttitle_two'], self.date_info['ttitle_three'] = get_titles(self.nzo, self.match_obj, self.original_dirname, True)
self.date_info['title'], self.date_info['title_two'], self.date_info['title_three'] = get_titles(self.nzo, self.match_obj, self.original_dirname)
self.date_info['ttitle'], self.date_info['ttitle_two'], self.date_info['ttitle_three'] = get_titles(self.nzo, self.match_obj, self.original_job_name, True)
self.date_info['title'], self.date_info['title_two'], self.date_info['title_three'] = get_titles(self.nzo, self.match_obj, self.original_job_name)
self.date_info['ep_name'], self.date_info['ep_name_two'], self.date_info['ep_name_three'] = get_descriptions(self.nzo, self.match_obj, self.original_dirname)
self.date_info['ep_name'], self.date_info['ep_name_two'], self.date_info['ep_name_three'] = get_descriptions(self.nzo, self.match_obj, self.original_job_name)
return True
@@ -814,6 +814,9 @@ class DateSorter(object):
mapping.append(('%.desc', ''))
mapping.append(('%_desc', ''))
# Replace dir-name before replacing %d for month
mapping.append(('%dn', self.original_job_name))
# Replace decades
mapping.append(('%decade', self.date_info['decade']))
mapping.append(('%0decade', self.date_info['decade_two']))
@@ -1168,13 +1171,13 @@ def eval_sort(sorttype, expression, name=None, multipart=''):
name = sanitize_foldername(name)
if sorttype == 'series':
name = name or ('%s S01E05 - %s [DTS]' % (Ttemplate('show-name'), Ttemplate('ep-name')))
sorter = sabnzbd.tvsort.SeriesSorter(None, name, path, 'tv')
elif sorttype == 'generic':
sorter = SeriesSorter(None, name, path, 'tv')
elif sorttype == 'movie':
name = name or (Ttemplate('movie-sp-name') + ' (2009)')
sorter = sabnzbd.tvsort.GenericSorter(None, name, path, 'tv')
sorter = MovieSorter(None, name, path, 'tv')
elif sorttype == 'date':
name = name or (Ttemplate('show-name') + ' 2009-01-02')
sorter = sabnzbd.tvsort.DateSorter(None, name, path, 'tv')
sorter = DateSorter(None, name, path, 'tv')
else:
return None
sorter.sort_string = expression
@@ -1183,14 +1186,14 @@ def eval_sort(sorttype, expression, name=None, multipart=''):
path = os.path.normpath(os.path.join(path, sorter.filename_set))
fname = Ttemplate('orgFilename')
fpath = path
if sorttype == 'generic' and '%1' in multipart:
if sorttype == 'movie' and '%1' in multipart:
fname = fname + multipart.replace('%1', '1')
fpath = fpath + multipart.replace('%1', '1')
if '%fn' in path:
path = path.replace('%fn', fname + '.avi')
path = path.replace('%fn', fname + '.mkv')
else:
if sorter.rename_or_not:
path = fpath + '.avi'
path = fpath + '.mkv'
else:
if sabnzbd.WIN32:
path += '\\'

View File

@@ -30,7 +30,7 @@ from httplib import IncompleteRead
from threading import Thread
import sabnzbd
from sabnzbd.constants import FUTURE_Q_FOLDER, Status
from sabnzbd.constants import DEF_TIMEOUT, MAX_URL_RETRIES, FUTURE_Q_FOLDER, Status
from sabnzbd.encoding import unicoder
import sabnzbd.misc as misc
import sabnzbd.dirscanner as dirscanner
@@ -59,8 +59,17 @@ class URLGrabber(Thread):
def add(self, url, future_nzo, when=None):
""" Add an URL to the URLGrabber queue, 'when' is seconds from now """
if when and future_nzo:
future_nzo.wait = time.time() + when
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
self.queue.put((url, future_nzo))
def stop(self):
@@ -81,7 +90,7 @@ class URLGrabber(Thread):
if future_nzo:
# Re-queue when too early and still active
if future_nzo.wait and future_nzo.wait > time.time():
if future_nzo.url_wait and future_nzo.url_wait > time.time():
self.add(url, future_nzo)
time.sleep(1.0)
continue
@@ -187,7 +196,7 @@ class URLGrabber(Thread):
retry = True
fn = None
elif retry:
fn, msg, retry, wait, data = _analyse(fn, url)
fn, msg, retry, wait, data = _analyse(fn, url, future_nzo)
if not fn:
if retry:
@@ -300,23 +309,28 @@ def _build_request(url):
return urllib2.urlopen(req)
def _analyse(fn, url):
def _analyse(fn, url, future_nzo):
""" 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 = ''
return None, msg, True, 60, data
# 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
# Check for an error response
if not fn or fn.msg != 'OK':
logging.debug('Received nothing from indexer, retry after 60 sec')
return None, fn.msg, True, 60, data
# 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
return fn, fn.msg, False, 0, data

View File

@@ -62,7 +62,7 @@ def test_nntp_server(host, port, server=None, username=None, password=None, ssl=
servers = get_servers()
got_pass = False
for server in servers:
if host in server:
if host in servers[server].host():
srv = servers[server]
password = srv.password()
got_pass = True

View File

@@ -189,6 +189,7 @@ class SysTrayIconThread(Thread):
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)
return True

View File

@@ -4,5 +4,5 @@
# You MUST use double quotes (so " and not ')
__version__ = "2.3.1"
__baseline__ = "f1695ec8753fbdb07bd67bdce25eeb3ebe70b972"
__version__ = "2.3.2"
__baseline__ = "1cac5799eb3f74f2e39942453b7b244fb0366e9a"

View File

@@ -121,7 +121,9 @@ class Wizard(object):
info['ssl'] = 0
info['ssl_verify'] = 2
else:
for server in servers:
# Sort servers to get the first enabled one
server_names = sorted(servers.keys(), key=lambda svr: '%d%02d%s' % (int(not servers[svr].enable()), servers[svr].priority(), servers[svr].displayname().lower()))
for server in server_names:
# If there are multiple servers, just use the first enabled one
s = servers[server]
info['host'] = s.host()

55
six/__init__.py Normal file → Executable file
View File

@@ -1,6 +1,4 @@
"""Utilities for writing code that runs on Python 2 and 3"""
# Copyright (c) 2010-2015 Benjamin Peterson
# Copyright (c) 2010-2017 Benjamin Peterson
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
@@ -20,6 +18,8 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
"""Utilities for writing code that runs on Python 2 and 3"""
from __future__ import absolute_import
import functools
@@ -29,7 +29,7 @@ import sys
import types
__author__ = "Benjamin Peterson <benjamin@python.org>"
__version__ = "1.10.0"
__version__ = "1.11.0"
# Useful for very coarse version differentiation.
@@ -241,6 +241,7 @@ _moved_attributes = [
MovedAttribute("map", "itertools", "builtins", "imap", "map"),
MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"),
MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"),
MovedAttribute("getoutput", "commands", "subprocess"),
MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"),
MovedAttribute("reduce", "__builtin__", "functools"),
@@ -262,10 +263,11 @@ _moved_attributes = [
MovedModule("html_entities", "htmlentitydefs", "html.entities"),
MovedModule("html_parser", "HTMLParser", "html.parser"),
MovedModule("http_client", "httplib", "http.client"),
MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"),
MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"),
MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
@@ -337,10 +339,12 @@ _urllib_parse_moved_attributes = [
MovedAttribute("quote_plus", "urllib", "urllib.parse"),
MovedAttribute("unquote", "urllib", "urllib.parse"),
MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"),
MovedAttribute("urlencode", "urllib", "urllib.parse"),
MovedAttribute("splitquery", "urllib", "urllib.parse"),
MovedAttribute("splittag", "urllib", "urllib.parse"),
MovedAttribute("splituser", "urllib", "urllib.parse"),
MovedAttribute("splitvalue", "urllib", "urllib.parse"),
MovedAttribute("uses_fragment", "urlparse", "urllib.parse"),
MovedAttribute("uses_netloc", "urlparse", "urllib.parse"),
MovedAttribute("uses_params", "urlparse", "urllib.parse"),
@@ -416,6 +420,8 @@ _urllib_request_moved_attributes = [
MovedAttribute("URLopener", "urllib", "urllib.request"),
MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
MovedAttribute("parse_http_list", "urllib2", "urllib.request"),
MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"),
]
for attr in _urllib_request_moved_attributes:
setattr(Module_six_moves_urllib_request, attr.name, attr)
@@ -679,11 +685,15 @@ if PY3:
exec_ = getattr(moves.builtins, "exec")
def reraise(tp, value, tb=None):
if value is None:
value = tp()
if value.__traceback__ is not tb:
raise value.with_traceback(tb)
raise value
try:
if value is None:
value = tp()
if value.__traceback__ is not tb:
raise value.with_traceback(tb)
raise value
finally:
value = None
tb = None
else:
def exec_(_code_, _globs_=None, _locs_=None):
@@ -699,19 +709,28 @@ else:
exec("""exec _code_ in _globs_, _locs_""")
exec_("""def reraise(tp, value, tb=None):
raise tp, value, tb
try:
raise tp, value, tb
finally:
tb = None
""")
if sys.version_info[:2] == (3, 2):
exec_("""def raise_from(value, from_value):
if from_value is None:
raise value
raise value from from_value
try:
if from_value is None:
raise value
raise value from from_value
finally:
value = None
""")
elif sys.version_info[:2] > (3, 2):
exec_("""def raise_from(value, from_value):
raise value from from_value
try:
raise value from from_value
finally:
value = None
""")
else:
def raise_from(value, from_value):
@@ -802,10 +821,14 @@ def with_metaclass(meta, *bases):
# This requires a bit of explanation: the basic idea is to make a dummy
# metaclass for one level of class instantiation that replaces itself with
# the actual metaclass.
class metaclass(meta):
class metaclass(type):
def __new__(cls, name, this_bases, d):
return meta(name, bases, d)
@classmethod
def __prepare__(cls, name, this_bases):
return meta.__prepare__(name, bases)
return type.__new__(metaclass, 'temporary_class', (), {})

View File

@@ -1,55 +0,0 @@
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.

View File

@@ -1,288 +0,0 @@
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.

View File

@@ -1,40 +0,0 @@
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

View File

@@ -1,258 +0,0 @@
__________________________________________________________________________
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.
__________________________________________________________________________

View File

Binary file not shown.