Compare commits

...

50 Commits

Author SHA1 Message Date
SABnzbd Automation
845d5cbaf2 Automatic translation update 2019-01-04 12:39:41 +00:00
Safihre
d1052ca7e0 Update text files for 2.3.7 RC 1 2019-01-04 13:34:55 +01:00
Safihre
d7c76a3b43 Send graceful Quit for UnRar first when aborting 2019-01-04 12:49:52 +01:00
Safihre
4c7f74b356 Show Details on Servers page could break graph display
Closes #1207
2019-01-01 12:02:06 +01:00
Safihre
b3dc74a07b Update Multipar to v1.3.0.3 2018-12-31 14:57:02 +01:00
Safihre
e9fa56a635 Log error-line in Direct Unpack
See https://forums.sabnzbd.org/viewtopic.php?f=16&t=23923
2018-12-30 10:34:25 +01:00
SABnzbd Automation
6729e94f14 Automatic translation update 2018-12-27 15:47:34 +00:00
Safihre
71dc1b5310 Add option to quickly add test NZB 2018-12-26 22:44:53 +01:00
Safihre
fe8065a7ef Remove unused translatable texts 2018-12-26 00:40:11 +01:00
Safihre
60afb7f444 Update copyright year to 2019 2018-12-24 11:51:48 +01:00
Safihre
3945eafb76 Update text files for 2.3.7 Beta 1 2018-12-24 11:46:23 +01:00
Safihre
763088e6a6 Add option to fail jobs based on first-articles 2018-12-24 09:13:57 +01:00
Safihre
a6ac88d5da Improve History information of failed jobs 2018-12-24 09:13:57 +01:00
Safihre
d35ebec8f9 Snapcraft uses the devel keyword 2018-12-24 08:53:44 +01:00
Safihre
aee2747220 Update Snapcraft config
Based on feedback in #1201
2018-12-24 08:33:28 +01:00
Safihre
eae68bd6ba RSS feedwithout ID would crash
See https://forums.sabnzbd.org/viewtopic.php?f=2&t=23910
@OneCDOnly
2018-12-23 11:44:08 +01:00
Safihre
190ec0a472 Update text files for 2.3.6 2018-12-20 22:33:13 +01:00
Safihre
468f01d839 Make clear that require_modern_tls is TLS 1.2 and above
@sanderjo
2018-12-19 11:17:25 +01:00
Erik Berkun-Drevnig
b03d68b434 Fix missing unrar, fix Python encoding 2018-12-19 08:57:59 +01:00
Safihre
0298beac15 Update text files for 2.3.6 RC 1 2018-12-17 13:56:34 +01:00
SABnzbd Automation
be6f047e31 Automatic translation update 2018-12-16 18:01:50 +00:00
Safihre
e8206371e4 Update Wizard example URL 2018-12-14 08:41:00 +01:00
SABnzbd Automation
6609248fce Automatic translation update 2018-12-06 08:32:33 +00:00
Safihre
0ae5c7f8aa Code improvements 2018-11-28 09:23:11 +01:00
Sander Jo
02b6f63156 Option require_modern_tls if you want TLS 1.2 or higher for NNTPS 2018-11-23 15:28:03 +01:00
Safihre
2b665667af Unavailable feeds would crash reading 2018-11-20 09:42:13 +01:00
jcfp
ad7fc240c7 help output: add -1 param for logging, 7z as supported file ext (#1192)
* help output: add -1 param for logging, 7z as supported file ext

* stop the universe from expanding
2018-11-18 09:02:37 +01:00
jcfp
aef878a0f2 update snapcraft url
the old link only displays a 'your session has expired' message...
2018-11-01 13:08:47 +01:00
Erik Berkun-Drevnig
2a967b62d9 Add Travis and AppVeyor badges (#1186)
* Add Travis and AppVeyor badges

* Add snap, issue resolution and license badges

* Switch master to develop branch

* Update README.md
2018-10-31 09:48:57 +01:00
Safihre
4c5ca149ba Update MultiPar to v1.3.0.2 2018-10-30 09:09:05 +01:00
jcfp
54d6e0dc21 fix extension filters in linux tray
correct typo (nbz) in filter name and bring the extension filters in line with the supported types (cf. sabnzbd/constants.py:99-100)
2018-10-29 22:17:23 +01:00
Erik Berkun-Drevnig
ecb1403776 Add initial snap support (#1183)
* Add initial snap support
* Apply review feedback
* Fix armhf and arm64 builds
* Use PPA and build lang files
* Add openssl for x86
* Remove unnecessary stage-packages
* Improve arch grammar
* Add back dev packages for building extensions
* Add back missing SSL
* Add icon
* Update snapcraft.yaml
2018-10-29 09:50:28 +01:00
Safihre
7e5c6d1c04 Update text files for 2.3.6 Beta 1 2018-10-26 09:27:59 +02:00
Safihre
96b140dee0 Update included Python license 2018-10-26 09:27:42 +02:00
Safihre
2e098b641f Update UnRar to 5.61 for macOS and Windows 2018-10-26 09:15:43 +02:00
Sander Jo
6678cb9d56 Remove \x00 from par2 creator info: uniformed method 2018-10-25 07:58:06 +02:00
Sander Jo
4b67405d16 Remove \x00 from par2 creator info 2018-10-19 08:45:58 +02:00
Safihre
7463a4abdc Existing RSS-feeds don't have the infourl yet
Rookie mistake.
2018-10-14 09:39:38 +02:00
SABnzbd Automation
163523048b Automatic translation update 2018-10-09 13:55:06 +00:00
Safihre
4892bc18f3 Prevent endless loop when disk-space is exceeded
It was a nice idea, to keep retrying to save the job, but it also breaks the pp-actions as it gets removed before it is ready to be removed.
Closes #1095
2018-10-09 15:14:49 +02:00
Safihre
217b2436f2 Detect RSS-feed login redirect and show specific error
Before it would overwrite specific errors detected above by general "No entries" warning.
2018-10-09 14:26:49 +02:00
Safihre
a9247ba934 No URL-encoding of RSS-URL's with comma's
Some indexers don't like that!
2018-10-09 13:55:58 +02:00
Safihre
8b2a6ef825 Link to details page of RSS-feed item if provided 2018-10-09 10:04:21 +02:00
Safihre
320495671b Add RSS-source icon to all tabs 2018-10-08 13:22:34 +02:00
Safihre
5ab872afa0 Assume correct SSL if test-host disabled
Closes #1179
2018-10-03 08:04:43 +02:00
Safihre
7ecb31805e Add API-capability to modify RSS filters
Closes #1154
2018-09-16 14:51:11 +02:00
Safihre
e8ebeb843c Retry All would not Retry URL's
Closes #1164
2018-09-16 13:32:13 +02:00
Safihre
3840678913 Rename thread-database getter
Each thread needs it's own DB-connection (see Python-docs). So for each CherryPy-thread we need to store the thread connection. The name of the function made it sound like we create a whole new connection, which isn't the case.
2018-09-16 13:31:43 +02:00
Safihre
da7082b17e Sending Retry for already completed jobs would give traceback
Due to missing file/folder.
See: https://forums.sabnzbd.org/viewtopic.php?f=2&t=23587
2018-09-16 10:11:32 +02:00
Safihre
6198f95e1e Do not log null-bytes in par2-creator
#1153
2018-09-11 16:21:06 +02:00
122 changed files with 3263 additions and 4060 deletions

9
.gitignore vendored
View File

@@ -1,4 +1,4 @@
#Compiled python
# Compiled python
*.py[cod]
# Working folders for Win build
@@ -7,6 +7,13 @@ dist/
locale/
srcdist/
# Snapcraft
parts/
prime/
stage/
snap/.snapcraft/
*.snap
# Generated email templates
email/*.tmpl

View File

@@ -1,5 +1,5 @@
*******************************************
*** This is SABnzbd 2.3.5 ***
*** This is SABnzbd 2.3.7 ***
*******************************************
SABnzbd is an open-source cross-platform binary newsreader.
It simplifies the process of downloading from Usenet dramatically,

View File

@@ -1,5 +1,5 @@
(c) Copyright 2007-2018 by "The SABnzbd-team" <team@sabnzbd.org>
(c) Copyright 2007-2019 by "The SABnzbd-team" <team@sabnzbd.org>
The SABnzbd-team is:

View File

@@ -1,10 +1,10 @@
SABnzbd 2.3.5
SABnzbd 2.3.7
-------------------------------------------------------------------------------
0) LICENSE
-------------------------------------------------------------------------------
(c) Copyright 2007-2018 by "The SABnzbd-team" <team@sabnzbd.org>
(c) Copyright 2007-2019 by "The SABnzbd-team" <team@sabnzbd.org>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License

View File

@@ -1,4 +1,4 @@
(c) Copyright 2007-2018 by "The SABnzbd-team" <team@sabnzbd.org>
(c) Copyright 2007-2019 by "The SABnzbd-team" <team@sabnzbd.org>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License

View File

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

View File

@@ -1,6 +1,12 @@
SABnzbd - The automated Usenet download tool
============================================
[![Average time to resolve an issue](https://isitmaintained.com/badge/resolution/sabnzbd/sabnzbd.svg)](https://isitmaintained.com/project/sabnzbd/sabnzbd "Average time to resolve an issue")
[![Travis CI](https://travis-ci.org/sabnzbd/sabnzbd.svg?branch=develop)](https://travis-ci.org/sabnzbd/sabnzbd)
[![AppVeryor](https://ci.appveyor.com/api/projects/status/github/sabnzbd/sabnzbd?svg=true&branch=develop)](https://ci.appveyor.com/project/Safihre/sabnzbd)
[![Snap Status](https://build.snapcraft.io/badge/sabnzbd/sabnzbd.svg)](https://snapcraft.io/sabnzbd)
[![License](https://img.shields.io/badge/license-GPL%20v2-blue.svg)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
SABnzbd is an Open Source Binary Newsreader written in Python.
It's totally free, incredibly easy to use, and works practically everywhere.

View File

@@ -1,25 +1,20 @@
Release Notes - SABnzbd 2.3.5
Release Notes - SABnzbd 2.3.7 RC 1
=========================================================
## Bug fixes since 2.3.4
- Reworked Deobfuscate.py script for much faster renaming
- All scripts can now receive input through environment variables
- Unable to set only one Indexer Category per category
- Could falsely report not enough blocks are available for repair
- Failures in un-(7)zip or file-joining would not fail the job
- Direct Unpack could abort unnecessarily
- Rare crash during file assembly
- Server hostname is now used in warnings and logs
- Improved disk performance measurement
- Overall improvements in stability and reliability
- Windows: MultiPar repair of joinable files could fail
- Windows: Tray icon also shows remaining size when paused
- Windows: Wizard would not default to installer language
- Windows: Update MultiPar to 1.3.0.1
- Windows and macOS: Update UnRar to 5.60
## Improvements and bug fixes since 2.3.7 Beta 1
- Added option to quickly add a verified test download
- Direct Unpack could get stuck processing
- Show Details on Servers page could break graph display
- Windows: Update MultiPar to 1.3.0.3
Looking for help with SABnzbd development:
https://www.reddit.com/r/usenet/918nxv/
## Improvements and bug fixes since 2.3.6
- Hopeless jobs will be failed faster, based on the first article of
each file. If 80% of these first articles is missing, the job is aborted.
- Option "fast_fail" added to disable the new behavior.
- Readout of some RSS feeds could result in a crash
Still looking for help with SABnzbd (Python 3) development!
https://www.reddit.com/r/usenet/comments/918nxv/
## Upgrading from 2.2.x and older
- Finish queue
@@ -45,4 +40,4 @@ https://www.reddit.com/r/usenet/918nxv/
that automatically verify, repair, extract and clean up posts downloaded
from Usenet.
(c) Copyright 2007-2018 by "The SABnzbd-team" \<team@sabnzbd.org\>
(c) Copyright 2007-2019 by "The SABnzbd-team" \<team@sabnzbd.org\>

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -182,7 +182,7 @@ def print_help():
print " -s --server <srv:port> Listen on server:port [*]"
print " -t --templates <templ> Template directory [*]"
print
print " -l --logging <0..2> Set logging level (-1=off, 0= least, 2= most) [*]"
print " -l --logging <-1..2> Set logging level (-1=off, 0= least, 2= most) [*]"
print " -w --weblogging Enable cherrypy access logging"
print
print " -b --browser <0..1> Auto browser launch (0= off, 1= on) [*]"
@@ -209,7 +209,7 @@ def print_help():
print " --new Run a new instance of SABnzbd"
print ""
print "NZB (or related) file:"
print " NZB or zipped NZB file, with extension .nzb, .zip, .rar, .gz, or .bz2"
print " NZB or compressed NZB file, with extension .nzb, .zip, .rar, .7z, .gz, or .bz2"
print ""
@@ -217,7 +217,7 @@ def print_version():
print """
%s-%s
Copyright (C) 2007-2018, The SABnzbd-Team <team@sabnzbd.org>
Copyright (C) 2007-2019, The SABnzbd-Team <team@sabnzbd.org>
SABnzbd comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. It is licensed under the

View File

@@ -142,7 +142,7 @@
<div class="colmask">
<div class="padding alt">
<h5 class="copyright">Copyright &copy; 2007-2018 The SABnzbd Team &lt;<a href="mailto:team@sabnzbd.org">team@sabnzbd.org</a>&gt;</h5>
<h5 class="copyright">Copyright &copy; 2007-2019 The SABnzbd Team &lt;<a href="mailto:team@sabnzbd.org">team@sabnzbd.org</a>&gt;</h5>
<p class="copyright"><small>$T('yourRights')</small></p>
</div>

View File

@@ -390,9 +390,10 @@
<th class="no-sort">$T('link-download')</th>
<th>$T('rss-filter')</th>
<th>$T('size')</th>
<th width="65%">$T('sort-title')</th>
<th width="60%">$T('sort-title')</th>
<th>$T('category')</th>
<th class="default-sort">$T('nzo-age')</th>
<th>$T('source')</th>
</tr>
</thead>
<!--#for $job in $matched#-->
@@ -411,6 +412,13 @@
<td>$job['title']</td>
<td>$job['cat']</td>
<td data-sort-value="$job['age_ms']">$job['age']</td>
<td data-sort-value="$job['baselink']" title="$job['baselink']">
<!--#if not $job['infourl']#-->
<div class="favicon source-icon" style="background-image: url(//$job['baselink']/favicon.ico);" data-domain="$job['baselink']"></div>
<!--#else#-->
<a class="favicon source-icon" href="$job['infourl']" target="_blank" style="background-image: url(//$job['baselink']/favicon.ico);" data-domain="$job['baselink']"></a>
<!--#end if#-->
</td>
</tr>
<!--#end for#-->
</table>
@@ -426,9 +434,10 @@
<th class="no-sort">$T('link-download')</th>
<th>$T('rss-filter')</th>
<th>$T('size')</th>
<th width="65%">$T('sort-title')</th>
<th width="60%">$T('sort-title')</th>
<th>$T('category')</th>
<th class="default-sort">$T('nzo-age')</th>
<th>$T('source')</th>
</tr>
</thead>
<!--#for $job in $unmatched#-->
@@ -447,6 +456,13 @@
<td>$job['title']</td>
<td>$job['cat']</td>
<td data-sort-value="$job['age_ms']">$job['age']</td>
<td data-sort-value="$job['baselink']" title="$job['baselink']">
<!--#if not $job['infourl']#-->
<div class="favicon source-icon" style="background-image: url(//$job['baselink']/favicon.ico);" data-domain="$job['baselink']"></div>
<!--#else#-->
<a class="favicon source-icon" href="$job['infourl']" target="_blank" style="background-image: url(//$job['baselink']/favicon.ico);" data-domain="$job['baselink']"></a>
<!--#end if#-->
</td>
</tr>
<!--#end for#-->
</table>
@@ -476,8 +492,10 @@
<td>$job['title']</td>
<td>$job['cat']</td>
<td data-sort-value="$job['baselink']" title="$job['baselink']">
<!--#if $job['baselink']#-->
<!--#if not $job['infourl']#-->
<div class="favicon source-icon" style="background-image: url(//$job['baselink']/favicon.ico);" data-domain="$job['baselink']"></div>
<!--#else#-->
<a class="favicon source-icon" href="$job['infourl']" target="_blank" style="background-image: url(//$job['baselink']/favicon.ico);" data-domain="$job['baselink']"></a>
<!--#end if#-->
</td>
</tr>

View File

@@ -450,6 +450,8 @@
\$(this).html(\$(this).html().replace("$T('showDetails')", "$T('hideDetails')"));
} else {
\$(this).html(\$(this).html().replace("$T('hideDetails')", "$T('showDetails')"));
// Recalculate the charts if changed while details were open
showCharts()
}
// Add coloring
addRowColor()

View File

@@ -573,6 +573,7 @@ h2.activeRSS {
float: left;
margin: 0 6px 0 2px;
text-align: center;
color: black !important;
}
.source-icon span {
top: -3px;

View File

@@ -137,6 +137,13 @@
</div>
<div class="col-sm-6 col-loading" data-bind="visible: !hasPerformanceInfo()">$T('Glitter-loading')<span class="loader-dot-one">.</span><span class="loader-dot-two">.</span><span class="loader-dot-three">.</span></div>
</div>
<div class="row test-download">
<div class="col-sm-6">$T('dashboard-testDownload')</div>
<div class="col-sm-6">
<a href="#" class="btn btn-default" data-bind="click: testDownload" data-size="100MB" data-tooltip="true" data-placement="top" title="$T('dashboard-testDownload-explain')"><span class="glyphicon glyphicon-download-alt"></span> 100 MB</a>
<a href="#" class="btn btn-default" data-bind="click: testDownload" data-size="1000MB" data-tooltip="true" data-placement="top" title="$T('dashboard-testDownload-explain')"><span class="glyphicon glyphicon-download-alt"></span> 1000 MB</a>
</div>
</div>
<hr />
<div class="row options-function-box">
<div class="col-sm-6">
@@ -633,7 +640,7 @@
</tbody>
</table>
<hr/>
<p><small>Copyright (C) 2007-2018, The SABnzbd Team &lt;team@sabnzbd.org&gt;<br/>$T('yourRights') </small></p>
<p><small>Copyright (C) 2007-2019, The SABnzbd Team &lt;team@sabnzbd.org&gt;<br/>$T('yourRights') </small></p>
</div>
</div>
</div>

View File

@@ -849,6 +849,24 @@ function ViewModel() {
})
}
// Download a test-NZB
self.testDownload = function(data, event) {
var nzbSize = $(event.target).data('size')
// Build request
var theCall = {
mode: "addurl",
name: "https://sabnzbd.org/tests/test_download_" + nzbSize + ".nzb",
priority: self.queue.priorityName["Force"]
}
// Add
callAPI(theCall).then(function(r) {
// Hide and reset/refresh
self.refresh()
$("#modal-options").modal("hide");
});
}
// Unblock server
self.unblockServer = function(servername) {
callSpecialAPI("./status/unblock_server/", {

View File

@@ -1419,6 +1419,14 @@ tr.queue-item>td:first-child>a {
margin: 5px 0px 10px;
}
#modal-options .test-download .btn {
padding: 1px 5px;
}
#modal-options #options-status .test-download .btn .glyphicon {
margin-right: 2px;
}
#modal-options .options-function-box {
margin-top: 5px;
}

View File

@@ -28,7 +28,7 @@
</table>
<div class="sabnzbd_logo main_sprite_container sprite_sabnzbdplus_logo"></div>
<p><strong>SABnzbd $T('version'):</strong> $version</p>
<p><small>Copyright (C) 2008-2016, The SABnzbd Team &lt;team@sabnzbd.org&gt;</small></p>
<p><small>Copyright (C) 2008-2019, The SABnzbd Team &lt;team@sabnzbd.org&gt;</small></p>
<p><small>$T('yourRights')</small></p>
</div>

View File

@@ -20,7 +20,7 @@
<div class="form-group">
<label for="host" class="col-sm-4 control-label">$T('srv-host')</label>
<div class="col-sm-8">
<input type="text" class="form-control" name="host" id="host" value="$host" placeholder="$T('wizard-example') news.giganews.com" />
<input type="text" class="form-control" name="host" id="host" value="$host" placeholder="$T('wizard-example') news.newshosting.com" />
</div>
</div>
<div class="form-group">

View File

@@ -53,7 +53,7 @@ the various releases.
2.4.2 2.4.1 2005 PSF yes
2.4.3 2.4.2 2006 PSF yes
2.5 2.4 2006 PSF yes
2.5.1 2.5 2007 PSF yes
2.7 2.6 2010 PSF yes
Footnotes:
@@ -89,9 +89,9 @@ license to reproduce, analyze, test, perform and/or display publicly,
prepare derivative works, distribute, and otherwise use Python
alone or in any derivative version, provided, however, that PSF's
License Agreement and PSF's notice of copyright, i.e., "Copyright (c)
2001, 2002, 2003, 2004, 2005, 2006, 2007 Python Software Foundation;
All Rights Reserved" are retained in Python alone or in any derivative
version prepared by Licensee.
2001, 2002, 2003, 2004, 2005, 2006 Python Software Foundation; All Rights
Reserved" are retained in Python alone or in any derivative version
prepared by Licensee.
3. In the event Licensee prepares a derivative work that is based on
or incorporates Python or any part thereof, and wants to make

View File

Binary file not shown.

View File

@@ -1,6 +1,6 @@
#
# SABnzbd Translation Template file EMAIL
# Copyright 2011-2018 The SABnzbd-Team
# Copyright 2011-2019 The SABnzbd-Team
# team@sabnzbd.org
#
msgid ""

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: 2018-03-15 13:04+0000\n"
"PO-Revision-Date: 2013-05-05 14:50+0000\n"
"Last-Translator: shypike <Unknown>\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2018-11-27 23:39+0000\n"
"Last-Translator: scootergrisen <scootergrisen@gmail.com>\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: 2018-03-16 05:37+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:47+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: email/email.tmpl:1
msgid ""
@@ -65,13 +65,13 @@ msgid ""
"<!--#end if#-->\n"
msgstr ""
"##\n"
"## Standard Email skabelon til SABnzbd\n"
"## Dette er en Cheetah skabelon\n"
"## Standard E-mail-skabelon til SABnzbd\n"
"## Dette er en Cheetah-skabelon\n"
"## Dokumentation: http://sabnzbd.wikidot.com/email-templates\n"
"##\n"
"## Linjeskift og blanktegn er betydelig!\n"
"## Linjeskift og blanktegn har betydning!\n"
"##\n"
"## Disse er e-mail-headerne \n"
"## Dette er e-mail-headerne \n"
"To: $to\n"
"From: $from\n"
"Date: $date\n"
@@ -79,7 +79,7 @@ msgstr ""
"job $name\n"
"X-priority: 5\n"
"X-MS-priority: 5\n"
"## Efter dette kommer body, den tomme linje kræves!\n"
"## Herefter kommer kroppen, den tomme linje skal være der!\n"
"\n"
"Hej,\n"
"<!--#if $status #-->\n"
@@ -100,13 +100,13 @@ msgstr ""
"<!--#end for#-->\n"
"<!--#end for#-->\n"
"<!--#if $script!=\"\" #-->\n"
"Output fra bruger script \"$script\" (Exit code = $script_ret):\n"
"Output fra brugerscriptet \"$script\" (Afslutningskode = $script_ret):\n"
"$script_output\n"
"<!--#end if#-->\n"
"<!--#if $status #-->\n"
"Enjoy!\n"
"Hav det godt!\n"
"<!--#else#-->\n"
"Sorry!\n"
"Beklager!\n"
"<!--#end if#-->\n"
#: email/rss.tmpl:1
@@ -138,25 +138,25 @@ msgid ""
"Bye\n"
msgstr ""
"##\n"
"## RSS Email skabelon til SABnzbd\n"
"## Dette er Cheetah skabelon\n"
"## RSS E-mail-skabelon til SABnzbd\n"
"## Dette er en Cheetah-skabelon\n"
"## Dokumentation: http://sabnzbd.wikidot.com/email-templates\n"
"##\n"
"## Linjeskift og blanktegn er betydelig!\n"
"## Linjeskift og blanktegn har betydning!\n"
"##\n"
"## Dette er email headers\n"
"## Dette er e-mai-headere\n"
"To: $to\n"
"From: $from\n"
"Date: $date\n"
"Subject: SABnzbd har tilføjet $antal jobs til køen\n"
"X-priority: 5\n"
"X-MS-priority: 5\n"
"## Efter dette kommer body, den tomme linje kræves!\n"
"## Herefter kommer kroppen, den tomme linje skal være der!\n"
"\n"
"Hej,\n"
"\n"
"SABnzbd har tilføjet $antal job(s) til køen.\n"
"De er fra RSS feed \"$feed\".\n"
"De er fra RSS-feedet \"$feed\".\n"
"<!--#for $job in $jobs#-->\n"
" $job <!--#slurp#-->\n"
"<!--#end for#-->\n"
@@ -189,24 +189,24 @@ msgid ""
"Bye\n"
msgstr ""
"##\n"
"## Dårlig URL Fetch E-mail skabelon for SABnzbd\n"
"## Dette er en Cheetah skabelon\n"
"## Dårlig URL-hentning af E-mail-skabelon til SABnzbd\n"
"## Dette er en Cheetah-skabelon\n"
"## Dokumentation: http://sabnzbd.wikidot.com/email-templates\n"
"##\n"
"## Linjeskift og blanktegn er betydelig!\n"
"## Linjeskift og blanktegn har betydning!\n"
"##\n"
"## Dette er email headers\n"
"## Dette er e-mail-headere\n"
"To: $to\n"
"From: $from\n"
"Date: $date\n"
"Subject: SABnzbd kunne ikke hente en NZB\n"
"X-priority: 5\n"
"X-MS-priority: 5\n"
"## Efter dette kommer body, den tomme linje kræves!\n"
"## Herefter kommer kroppen, den tomme linje skal være der!\n"
"\n"
"Hej,\n"
"\n"
"SABnzbd kunne ikke hente NZB fra $url.\n"
"Fejl meddelelsen er: $msg\n"
"Fejlmeddelelsen er: $msg\n"
"\n"
"Farvel\n"

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: 2018-03-15 13:04+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2013-05-05 14:50+0000\n"
"Last-Translator: Thomas Lucke (Lucky) <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: 2018-03-16 05:37+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:47+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: email/email.tmpl:1
msgid ""

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: 2018-03-15 13:04+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2013-05-05 14:50+0000\n"
"Last-Translator: shypike <Unknown>\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: 2018-03-16 05:37+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:47+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: email/email.tmpl:1
msgid ""

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: 2018-03-15 13:04+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2013-05-05 14:50+0000\n"
"Last-Translator: Matti Ylönen <Unknown>\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: 2018-03-16 05:37+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:47+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: email/email.tmpl:1
msgid ""

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: 2018-03-15 13:04+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2013-05-05 14:50+0000\n"
"Last-Translator: Fox Ace <Unknown>\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: 2018-03-16 05:37+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:47+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: email/email.tmpl:1
msgid ""

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: 2018-03-15 13:04+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2017-08-01 16:45+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: 2018-03-16 05:37+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:47+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: email/email.tmpl:1
msgid ""

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: 2018-03-15 13:04+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2013-05-05 14:50+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\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: 2018-03-16 05:37+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:47+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: email/email.tmpl:1
msgid ""

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: 2018-03-15 13:04+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2013-05-05 14:50+0000\n"
"Last-Translator: shypike <Unknown>\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: 2018-03-16 05:37+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:47+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: email/email.tmpl:1
msgid ""

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: 2018-03-15 13:04+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2013-05-05 14:50+0000\n"
"Last-Translator: Tomasz 'Zen' Napierala <tomasz@napierala.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: 2018-03-16 05:37+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:47+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: email/email.tmpl:1
msgid ""

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: 2018-03-15 13:04+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2013-05-05 14:50+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: 2018-03-16 05:37+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:47+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: email/email.tmpl:1
msgid ""

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: 2018-03-15 13:04+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2013-05-05 14:50+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: 2018-03-16 05:37+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:47+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: email/email.tmpl:1
msgid ""

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: 2018-03-15 13:04+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2013-05-05 14:50+0000\n"
"Last-Translator: Pavel Maryanov <Unknown>\n"
"Language-Team: Russian <gnu@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: 2018-03-16 05:37+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:47+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: email/email.tmpl:1
msgid ""

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: 2018-03-15 13:04+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2017-06-24 19:51+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
"Language-Team: Launchpad Serbian Translators\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2018-03-16 05:37+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:47+0000\n"
"X-Generator: Launchpad (build 18847)\n"
"Language: sr\n"
#: email/email.tmpl:1

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: 2018-03-15 13:04+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2017-06-24 19:50+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>\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: 2018-03-16 05:37+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:47+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: email/email.tmpl:1
msgid ""

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: 2018-03-15 13:04+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2015-10-24 11:05+0000\n"
"Last-Translator: shypike <Unknown>\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: 2018-03-16 05:37+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:47+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: email/email.tmpl:1
msgid ""

View File

@@ -1,6 +1,6 @@
#
# SABnzbd Translation Template file MAIN
# Copyright 2011-2018 The SABnzbd-Team
# Copyright 2011-2019 The SABnzbd-Team
# team@sabnzbd.org
#
msgid ""
@@ -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: 2018-09-07 10:10+W. Europe Daylight Time\n"
"POT-Creation-Date: 2019-01-04 12:49+W. Europe Standard Time\n"
"Generated-By: pygettext.py 1.5\n"
@@ -412,6 +412,10 @@ msgstr ""
msgid "Unpacked %s files/folders in %s"
msgstr ""
#: sabnzbd/directunpacker.py [Warning message]
msgid "Unable to stop the unrar process."
msgstr ""
#: sabnzbd/directunpacker.py [Warning message]
msgid "Direct Unpack was automatically enabled."
msgstr ""
@@ -890,10 +894,6 @@ msgstr ""
msgid "Starting Repair"
msgstr ""
#: sabnzbd/newsunpack.py [Warning message]
msgid "Par verify failed on %s, while QuickCheck succeeded!"
msgstr ""
#: sabnzbd/newsunpack.py
msgid "Repairing failed, %s"
msgstr ""
@@ -1386,10 +1386,6 @@ msgstr ""
msgid "Download failed - Not on your server(s)"
msgstr ""
#: sabnzbd/postproc.py
msgid "No post-processing because of failed verification"
msgstr ""
#: sabnzbd/postproc.py
msgid "Moving"
msgstr ""
@@ -2026,7 +2022,7 @@ msgstr ""
msgid "Email"
msgstr ""
#: sabnzbd/skintext.py [Main menu item] # sabnzbd/skintext.py
#: sabnzbd/skintext.py [Main menu item]
msgid "Categories"
msgstr ""
@@ -2422,6 +2418,14 @@ msgstr ""
msgid "Repeat test"
msgstr ""
#: sabnzbd/skintext.py
msgid "Test download"
msgstr ""
#: sabnzbd/skintext.py
msgid "Adds a verified test NZB of the specified size, filled with random data. Can be used to verify your setup."
msgstr ""
#: sabnzbd/skintext.py
msgid "Config File"
msgstr ""
@@ -3390,14 +3394,6 @@ msgstr ""
msgid "Send group command before requesting articles."
msgstr ""
#: sabnzbd/skintext.py
msgid "Only use this server for these categories."
msgstr ""
#: sabnzbd/skintext.py
msgid "None of the enabled servers have the 'Default' category selected. Jobs in the queue that are not assigned to one of the server's categories will not be downloaded."
msgstr ""
#: sabnzbd/skintext.py
msgid "Personal notes"
msgstr ""
@@ -3570,10 +3566,6 @@ msgstr ""
msgid "Enable Growl"
msgstr ""
#: sabnzbd/skintext.py [Don't translate "Growl"]
msgid "Send notifications to Growl"
msgstr ""
#: sabnzbd/skintext.py [Don't translate "Growl"]
msgid "Only use for remote Growl server (host:port)"
msgstr ""
@@ -3590,18 +3582,10 @@ msgstr ""
msgid "Enable NotifyOSD"
msgstr ""
#: sabnzbd/skintext.py [Don't translate "NotifyOSD"]
msgid "Send notifications to NotifyOSD"
msgstr ""
#: sabnzbd/skintext.py # sabnzbd/skintext.py [Header for OSX Notfication Center section]
msgid "Notification Center"
msgstr ""
#: sabnzbd/skintext.py
msgid "Send notifications to Notification Center"
msgstr ""
#: sabnzbd/skintext.py
msgid "Enable Windows Notifications"
msgstr ""

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
#
# SABnzbd Translation Template file NSIS
# Copyright 2011-2018 The SABnzbd-Team
# Copyright 2011-2019 The SABnzbd-Team
# team@sabnzbd.org
#
msgid ""

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: 2018-03-15 13:05+0000\n"
"PO-Revision-Date: 2017-04-10 11:28+0000\n"
"Last-Translator: Safihre <safihre@sabnzbd.org>\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2018-11-27 23:30+0000\n"
"Last-Translator: scootergrisen <scootergrisen@gmail.com>\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: 2018-03-16 05:38+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: NSIS_Installer.nsi
msgid "Show Release Notes"
@@ -23,7 +23,7 @@ msgstr "Vis udgivelsesbemærkninger"
#: NSIS_Installer.nsi
msgid "Start SABnzbd"
msgstr ""
msgstr "Start SABnzbd"
#: NSIS_Installer.nsi
msgid "Support the project, Donate!"
@@ -38,7 +38,7 @@ msgid ""
"The installation directory has changed (now in \"Program Files\"). \\nIf you "
"run SABnzbd as a service, you need to update the service settings."
msgstr ""
"Installationsmappen er ændret (nu i \"Program Files \"). \\nHvis du kører "
"Installationsmappen er ændret (nu i \"Program Files\"). \\nHvis du kører "
"SABnzbd som en tjeneste, skal du opdatere tjenesteindstillingerne."
#: NSIS_Installer.nsi
@@ -55,7 +55,7 @@ msgstr "Skrivebordsikon"
#: NSIS_Installer.nsi
msgid "NZB File association"
msgstr "NZB filtilknytning"
msgstr "NZB-filtilknytning"
#: NSIS_Installer.nsi
msgid "Delete Program"
@@ -70,20 +70,20 @@ msgid ""
"This system requires the Microsoft runtime library VC90 to be installed "
"first. Do you want to do that now?"
msgstr ""
"Dette system kræver, at Microsoft runtime biblioteket VC90 skal installeres "
"først. Ønsker du at gøre det nu?"
"Systemet kræver at Microsoft runtime-biblioteket VC90 skal installeres "
"først. Vil du gøre det nu?"
#: NSIS_Installer.nsi
msgid "Downloading Microsoft runtime installer..."
msgstr "Downloader Microsoft runtime installationsfil..."
msgstr "Downloader Microsoft runtime-installationsfil..."
#: NSIS_Installer.nsi
msgid "Download error, retry?"
msgstr "Download fejl, prøv igen?"
msgstr "Fejl ved download, prøv igen?"
#: NSIS_Installer.nsi
msgid "Cannot install without runtime library, retry?"
msgstr "Kan ikke installere uden runtime bibliotek, prøv igen?"
msgstr "Kan ikke installere uden runtime-bibliotek, prøv igen?"
#: NSIS_Installer.nsi
msgid ""
@@ -91,8 +91,7 @@ msgid ""
"the previous version or `Cancel` to cancel this upgrade."
msgstr ""
"Du kan ikke overskrive en eksisterende installation. \\n\\nKlik `OK` for at "
"fjerne den tidligere version eller `Annuller` for at annullere denne "
"opgradering."
"fjerne den tidligere version eller `Annuller` for at annullere opgraderingen."
#: NSIS_Installer.nsi
msgid "Your settings and data will be preserved."

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: 2018-03-15 13:05+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2017-05-22 08:00+0000\n"
"Last-Translator: larshuth <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: 2018-03-16 05:38+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: NSIS_Installer.nsi
msgid "Show Release Notes"

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: 2018-03-15 13:05+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2013-05-05 14:50+0000\n"
"Last-Translator: Victor Herrero <victorhera@gmail.com>\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: 2018-03-16 05:38+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: NSIS_Installer.nsi
msgid "Show Release Notes"

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: 2018-03-15 13:05+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2017-04-02 07:38+0000\n"
"Last-Translator: Paavo Rissanen <paavo.rissanen@outlook.com>\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: 2018-03-16 05:38+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: NSIS_Installer.nsi
msgid "Show Release Notes"

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: 2018-03-15 13:05+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2017-03-21 08:58+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: 2018-03-16 05:38+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: NSIS_Installer.nsi
msgid "Show Release Notes"

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: 2018-03-15 13:05+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2017-05-06 09:07+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: 2018-03-16 05:38+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: NSIS_Installer.nsi
msgid "Show Release Notes"

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: 2018-03-15 13:05+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2013-05-05 14:50+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\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: 2018-03-16 05:38+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: NSIS_Installer.nsi
msgid "Show Release Notes"

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: 2018-03-15 13:05+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2017-03-19 09: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: 2018-03-16 05:38+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: NSIS_Installer.nsi
msgid "Show Release Notes"

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: 2018-03-15 13:05+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2013-05-05 14:50+0000\n"
"Last-Translator: Tomasz 'Zen' Napierala <tomasz@napierala.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: 2018-03-16 05:38+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: NSIS_Installer.nsi
msgid "Show Release Notes"

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: 2018-03-15 13:05+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2013-05-05 14:50+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: 2018-03-16 05:38+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: NSIS_Installer.nsi
msgid "Show Release Notes"

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: 2018-03-15 13:05+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2013-05-05 14:50+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: 2018-03-16 05:38+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: NSIS_Installer.nsi
msgid "Show Release Notes"

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: 2018-03-15 13:05+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2013-05-05 14:50+0000\n"
"Last-Translator: Pavel Maryanov <Unknown>\n"
"Language-Team: Russian <gnu@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: 2018-03-16 05:38+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: NSIS_Installer.nsi
msgid "Show Release Notes"

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: 2018-03-15 13:05+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2013-05-05 14:50+0000\n"
"Last-Translator: Ozzii <Unknown>\n"
"Language-Team: Launchpad Serbian Translators\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2018-03-16 05:38+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n"
"X-Generator: Launchpad (build 18847)\n"
"Language: sr\n"
#: NSIS_Installer.nsi

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: 2018-03-15 13:05+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2013-05-05 14:50+0000\n"
"Last-Translator: Andreas Lindberg <andypandyswe@gmail.com>\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: 2018-03-16 05:38+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: NSIS_Installer.nsi
msgid "Show Release Notes"

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: 2018-03-15 13:05+0000\n"
"POT-Creation-Date: 2018-12-24 11:01+0000\n"
"PO-Revision-Date: 2017-05-28 17:17+0000\n"
"Last-Translator: ninjai <ninjai.us@gmail.com>\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: 2018-03-16 05:38+0000\n"
"X-Generator: Launchpad (build 18571)\n"
"X-Launchpad-Export-Date: 2018-12-25 04:49+0000\n"
"X-Generator: Launchpad (build 18847)\n"
#: NSIS_Installer.nsi
msgid "Show Release Notes"

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -202,7 +202,7 @@ def sig_handler(signum=None, frame=None):
INIT_LOCK = Lock()
def connect_db(thread_index=0):
def get_db_connection(thread_index=0):
# Create a connection and store it in the current thread
if not (hasattr(cherrypy.thread_data, 'history_db') and cherrypy.thread_data.history_db):
cherrypy.thread_data.history_db = sabnzbd.database.HistoryDB()
@@ -223,7 +223,7 @@ def initialize(pause_downloader=False, clean_up=False, evalSched=False, repair=0
__SHUTTING_DOWN__ = False
# Set global database connection for Web-UI threads
cherrypy.engine.subscribe('start_thread', connect_db)
cherrypy.engine.subscribe('start_thread', get_db_connection)
# Paused?
pause_downloader = pause_downloader or cfg.start_paused()
@@ -1195,6 +1195,10 @@ def test_cert_checking():
On systems with at least Python > 2.7.9
"""
if sabnzbd.HAVE_SSL_CONTEXT:
# User disabled the test, assume proper SSL certificates
if not cfg.selftest_host():
return True
# Try a connection to our test-host
try:
import ssl
ctx = ssl.create_default_context()

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -65,13 +65,12 @@ from sabnzbd.articlecache import ArticleCache
from sabnzbd.utils.servertests import test_nntp_server_dict
from sabnzbd.bpsmeter import BPSMeter
from sabnzbd.rating import Rating
from sabnzbd.getipaddress import localipv4, publicipv4, ipv6
from sabnzbd.getipaddress import localipv4, publicipv4, ipv6, addresslookup
from sabnzbd.newsunpack import userxbit
from sabnzbd.database import build_history_info, unpack_history_info, HistoryDB
import sabnzbd.notifier
import sabnzbd.rss
import sabnzbd.emailer
import sabnzbd.getipaddress as getipaddress
##############################################################################
# API error messages
@@ -501,7 +500,7 @@ def _api_history(name, output, kwargs):
special = value.lower()
del_files = bool(int_conv(kwargs.get('del_files')))
if special in ('all', 'failed', 'completed'):
history_db = sabnzbd.connect_db()
history_db = sabnzbd.get_db_connection()
if special in ('all', 'failed'):
if del_files:
del_job_files(history_db.get_failed_paths(search))
@@ -1149,6 +1148,24 @@ def handle_rss_api(output, kwargs):
feed.set_dict(kwargs)
else:
config.ConfigRSS(name, kwargs)
action = kwargs.get('filter_action')
if action in ('add', 'update'):
# Use the general function, but catch the redirect-raise
try:
kwargs['feed'] = name
sabnzbd.interface.ConfigRss('/').internal_upd_rss_filter(**kwargs)
except cherrypy.HTTPRedirect:
pass
elif action == 'delete':
# Use the general function, but catch the redirect-raise
try:
kwargs['feed'] = name
sabnzbd.interface.ConfigRss('/').internal_del_rss_filter(**kwargs)
except cherrypy.HTTPRedirect:
pass
return name
@@ -1197,7 +1214,7 @@ def build_status(skip_dashboard=False, output=None):
info['ipv6'] = ipv6()
# Dashboard: DNS-check
try:
getipaddress.addresslookup(cfg.selftest_host())
addresslookup(cfg.selftest_host())
info['dnslookup'] = "OK"
except:
info['dnslookup'] = None
@@ -1509,16 +1526,17 @@ def options_list(output):
})
def retry_job(job, new_nzb, password):
def retry_job(job, new_nzb=None, password=None):
""" Re enter failed job in the download queue """
if job:
history_db = sabnzbd.connect_db()
history_db = sabnzbd.get_db_connection()
futuretype, url, pp, script, cat = history_db.get_other(job)
if futuretype:
if pp == 'X':
pp = None
sabnzbd.add_url(url, pp, script, cat)
nzo_id = sabnzbd.add_url(url, pp, script, cat)
history_db.remove_history(job)
return nzo_id
else:
path = history_db.get_path(job)
if path:
@@ -1530,8 +1548,13 @@ def retry_job(job, new_nzb, password):
def retry_all_jobs():
""" Re enter all failed jobs in the download queue """
history_db = sabnzbd.connect_db()
return NzbQueue.do.retry_all_jobs(history_db)
# Fetch all retryable folders from History
items = sabnzbd.api.build_history()[0]
nzo_ids = []
for item in items:
if item['retry']:
nzo_ids.append(retry_job(item['nzo_id']))
return nzo_ids
def del_job_files(job_paths):
@@ -1548,7 +1571,7 @@ def del_hist_job(job, del_files):
if path:
PostProcessor.do.delete(job, del_files=del_files)
else:
history_db = sabnzbd.connect_db()
history_db = sabnzbd.get_db_connection()
path = history_db.get_path(job)
history_db.remove_history(job)
@@ -1759,7 +1782,7 @@ def build_history(start=None, limit=None, verbose=False, verbose_list=None, sear
# Aquire the db instance
try:
history_db = sabnzbd.connect_db()
history_db = sabnzbd.get_db_connection()
close_db = False
except:
# Required for repairs at startup because Cherrypy isn't active yet
@@ -1811,10 +1834,9 @@ def build_history(start=None, limit=None, verbose=False, verbose_list=None, sear
item['show_details'] = 'True'
else:
item['show_details'] = ''
if item['bytes']:
item['size'] = format_bytes(item['bytes'])
else:
item['size'] = ''
item['size'] = format_bytes(item['bytes'])
if 'loaded' not in item:
item['loaded'] = False
@@ -2010,7 +2032,6 @@ def history_remove_failed():
del_job_files(history_db.get_failed_paths())
history_db.remove_failed()
history_db.close()
del history_db
def history_remove_completed():
@@ -2019,4 +2040,3 @@ def history_remove_completed():
history_db = HistoryDB()
history_db.remove_completed()
history_db.close()
del history_db

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -81,11 +81,6 @@ class Assembler(Thread):
# Abort all direct unpackers, just to be sure
sabnzbd.directunpacker.abort_all()
# Place job back in queue and wait 30 seconds to hope it gets resolved
self.process(job)
sleep(30)
continue
# Prepare filename
nzo.verify_nzf_filename(nzf)
nzf.filename = sanitize_filename(nzf.filename)

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -146,6 +146,7 @@ nice = OptionStr('misc', 'nice', '', validation=no_nonsense)
win_process_prio = OptionNumber('misc', 'win_process_prio', 3)
ionice = OptionStr('misc', 'ionice', '', validation=no_nonsense)
fail_hopeless_jobs = OptionBool('misc', 'fail_hopeless_jobs', True)
fast_fail = OptionBool('misc', 'fast_fail', True)
autodisconnect = OptionBool('misc', 'auto_disconnect', True)
no_dupes = OptionNumber('misc', 'no_dupes', 0)
no_series_dupes = OptionNumber('misc', 'no_series_dupes', 0)
@@ -265,6 +266,7 @@ no_penalties = OptionBool('misc', 'no_penalties', False)
debug_log_decoding = OptionBool('misc', 'debug_log_decoding', False)
ignore_empty_files = OptionBool('misc', 'ignore_empty_files', False)
x_frame_options = OptionBool('misc', 'x_frame_options', True)
require_modern_tls = OptionBool('misc', 'require_modern_tls', False)
# Text values
rss_odd_titles = OptionList('misc', 'rss_odd_titles', ['nzbindex.nl/', 'nzbindex.com/', 'nzbclub.com/'])

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -990,7 +990,7 @@ def get_rss():
for feed_uri in feed.uri():
if new_feed_uris and not urlparse(feed_uri).scheme and urlparse(new_feed_uris[-1]).scheme:
# Current one has no scheme but previous one does, append to previous
new_feed_uris[-1] += '%2C' + feed_uri
new_feed_uris[-1] += ',' + feed_uri
have_new_uri = True
continue
# Add full working URL

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -400,7 +400,7 @@ class HistoryDB(object):
return name
def get_path(self, nzo_id):
""" Return the `incomplete` path of the job `nzo_id` """
""" Return the `incomplete` path of the job `nzo_id` if it is still there """
t = (nzo_id,)
path = ''
if self.execute('SELECT path FROM history WHERE nzo_id=?', t):
@@ -408,7 +408,9 @@ class HistoryDB(object):
path = self.c.fetchone().get('path')
except AttributeError:
pass
return path
if os.path.exists(path):
return path
return None
def get_other(self, nzo_id):
""" Return additional data for job `nzo_id` """
@@ -421,9 +423,10 @@ class HistoryDB(object):
pp = items.get('pp')
script = items.get('script')
cat = items.get('category')
return dtype, url, pp, script, cat
except (AttributeError, IndexError):
return '', '', '', '', ''
return dtype, url, pp, script, cat
pass
return '', '', '', '', ''
def dict_factory(cursor, row):

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -180,7 +180,7 @@ class DirectUnpacker(threading.Thread):
'checksum failed', 'You need to start extraction from a previous volume',
'password is incorrect', 'Write error', 'checksum error',
'start extraction from a previous volume')):
logging.info('Error in DirectUnpack of %s', self.cur_setname)
logging.info('Error in DirectUnpack of %s: %s', self.cur_setname, linebuf.strip())
self.abort()
if linebuf.endswith('\n'):
@@ -385,9 +385,25 @@ class DirectUnpacker(threading.Thread):
# Abort Unrar
if self.active_instance:
# First we try to abort gracefully
try:
self.active_instance.stdin.write('Q\n')
time.sleep(0.2)
except IOError:
pass
# Now force kill and give it a bit of time
self.active_instance.kill()
# We need to wait for it to kill the process
self.active_instance.wait()
time.sleep(0.2)
# Have to collect the return-code to avoid zombie
# But it will block forever if the process is in special state.
# That should never happen, but it can happen on broken unrar's
if self.active_instance.poll():
self.active_instance.communicate()
else:
# It is still running?!? This should never happen
logging.warning(T('Unable to stop the unrar process.'))
# Wake up the thread
with self.next_file_lock:
@@ -412,7 +428,6 @@ class DirectUnpacker(threading.Thread):
except:
# The user will have to remove it themselves
logging.info('Failed to clean Direct Unpack after aborting %s', rarfile_nzf.filename, exc_info=True)
pass
else:
# We can just remove the whole path
remove_all(extraction_path, recursive=True)

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -149,7 +149,7 @@ def check_access(access_type=4):
def check_hostname():
""" Check if hostname is allowed, to mitigate DNS-rebinding attack.
Similar to CVE-2018-5702, we need to add protection even
Similar to CVE-2019-5702, we need to add protection even
if only allowed to be accessed via localhost.
"""
# If login is enabled, no API-key can be deducted
@@ -499,7 +499,7 @@ class MainPage(object):
# No session key check, due to fixed URLs
name = kwargs.get('name')
if name:
history_db = sabnzbd.connect_db()
history_db = sabnzbd.get_db_connection()
return ShowString(history_db.get_name(name), history_db.get_script_log(name))
else:
raise Raiser(self.__root)
@@ -1106,7 +1106,7 @@ class HistoryPage(object):
@secured_expose(check_session_key=True)
def purge(self, **kwargs):
history_db = sabnzbd.connect_db()
history_db = sabnzbd.get_db_connection()
history_db.remove_history()
raise queueRaiser(self.__root, kwargs)
@@ -1133,7 +1133,7 @@ class HistoryPage(object):
@secured_expose(check_session_key=True)
def purge_failed(self, **kwargs):
del_files = bool(int_conv(kwargs.get('del_files')))
history_db = sabnzbd.connect_db()
history_db = sabnzbd.get_db_connection()
if del_files:
del_job_files(history_db.get_failed_paths())
history_db.remove_failed()
@@ -1173,7 +1173,7 @@ class HistoryPage(object):
# No session key check, due to fixed URLs
name = kwargs.get('name')
if name:
history_db = sabnzbd.connect_db()
history_db = sabnzbd.get_db_connection()
return ShowString(history_db.get_name(name), history_db.get_script_log(name))
else:
raise Raiser(self.__root)
@@ -1364,14 +1364,14 @@ class ConfigSwitches(object):
##############################################################################
SPECIAL_BOOL_LIST = \
('start_paused', 'no_penalties', 'ignore_wrong_unrar', 'overwrite_files', 'enable_par_cleanup',
('start_paused', 'no_penalties', 'fast_fail', 'ignore_wrong_unrar', 'overwrite_files', 'enable_par_cleanup',
'queue_complete_pers', 'api_warnings', 'ampm', 'enable_unrar', 'enable_unzip', 'enable_7zip',
'enable_filejoin', 'enable_tsjoin', 'ignore_unrar_dates', 'debug_log_decoding',
'multipar', 'osx_menu', 'osx_speed', 'win_menu', 'use_pickle', 'allow_incomplete_nzb',
'rss_filenames', 'ipv6_hosting', 'keep_awake', 'empty_postproc', 'html_login', 'wait_for_dfolder',
'max_art_opt', 'warn_empty_nzb', 'enable_bonjour', 'reject_duplicate_files', 'warn_dupl_jobs',
'replace_illegal', 'backup_for_duplicates', 'disable_api_key', 'api_logging',
'ignore_empty_files', 'x_frame_options'
'ignore_empty_files', 'x_frame_options', 'require_modern_tls'
)
SPECIAL_VALUE_LIST = \
('size_limit', 'folder_max_length', 'fsys_type', 'movie_rename_limit', 'nomedia_marker',
@@ -1877,9 +1877,13 @@ class ConfigRss(object):
@secured_expose(check_session_key=True, check_configlock=True)
def upd_rss_filter(self, **kwargs):
""" Wrapper, so we can call from api.py """
self.internal_upd_rss_filter(**kwargs)
def internal_upd_rss_filter(self, **kwargs):
""" Save updated filter definition """
try:
cfg = config.get_rss()[kwargs.get('feed')]
feed_cfg = config.get_rss()[kwargs.get('feed')]
except KeyError:
raise rssRaiser(self.__root, kwargs)
@@ -1893,14 +1897,14 @@ class ConfigRss(object):
enabled = kwargs.get('enabled', '0')
if filt:
cfg.filters.update(int(kwargs.get('index', 0)), (cat, pp, script, kwargs.get('filter_type'),
feed_cfg.filters.update(int(kwargs.get('index', 0)), (cat, pp, script, kwargs.get('filter_type'),
platform_encode(filt), prio, enabled))
# Move filter if requested
index = int_conv(kwargs.get('index', ''))
new_index = kwargs.get('new_index', '')
if new_index and int_conv(new_index) != index:
cfg.filters.move(int(index), int_conv(new_index))
feed_cfg.filters.move(int(index), int_conv(new_index))
config.save_config()
self.__evaluate = False
@@ -1918,13 +1922,17 @@ class ConfigRss(object):
@secured_expose(check_session_key=True, check_configlock=True)
def del_rss_filter(self, **kwargs):
""" Wrapper, so we can call from api.py """
self.internal_del_rss_filter(**kwargs)
def internal_del_rss_filter(self, **kwargs):
""" Remove one RSS filter """
try:
cfg = config.get_rss()[kwargs.get('feed')]
feed_cfg = config.get_rss()[kwargs.get('feed')]
except KeyError:
raise rssRaiser(self.__root, kwargs)
cfg.filters.delete(int(kwargs.get('index', 0)))
feed_cfg.filters.delete(int(kwargs.get('index', 0)))
config.save_config()
self.__evaluate = False
self.__show_eval_button = True
@@ -2522,6 +2530,7 @@ def GetRssLog(feed):
# These fields could be empty
job['cat'] = job.get('cat', '')
job['size'] = job.get('size', '')
job['infourl'] = job.get('infourl', '')
# Auto-fetched jobs didn't have these fields set
if job.get('url'):

View File

@@ -1,6 +1,6 @@
#!/usr/bin/python -OO
# -*- coding: utf-8 -*-
# Copyright 2011-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2011-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -1142,10 +1142,7 @@ def par2_repair(parfile_nzf, nzo, workdir, setname, single):
# Remove this set so we don't try to check it again
nzo.remove_parset(parfile_nzf.setname)
else:
if qc_result:
logging.warning(T('Par verify failed on %s, while QuickCheck succeeded!'), parfile)
else:
logging.info('Par verify failed on %s!', parfile)
logging.info('Par verify failed on %s!', parfile)
if not readd:
# Failed to repair -> remove this set

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -174,6 +174,10 @@ class NNTP(object):
# Setup the SSL socket
ctx = ssl.create_default_context()
if sabnzbd.cfg.require_modern_tls():
# We want a modern TLS (1.2 or higher), so we disallow older protocol versions (<= TLS 1.1)
ctx.options |= ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 | ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1
# Only verify hostname when we're strict
if nw.server.ssl_verify < 2:
ctx.check_hostname = False

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -181,22 +181,6 @@ class NzbQueue(object):
logging.info('Skipping repair for job %s', folder)
return result
def retry_all_jobs(self, history_db):
""" Retry all retryable jobs in History """
result = []
# Retryable folders from History
items = sabnzbd.api.build_history()[0]
registered = [(platform_encode(os.path.basename(item['path'])),
item['nzo_id'])
for item in items if item['retry']]
for job in registered:
logging.info('Repairing job %s', job[0])
result.append(self.repair_job(job[0]))
history_db.remove_history(job[1])
return bool(result)
def repair_job(self, folder, new_nzb=None, password=None):
""" Reconstruct admin for a single job folder, optionally with new NZB """
def all_verified(path):
@@ -803,7 +787,7 @@ class NzbQueue(object):
if nzo.precheck:
nzo.save_to_disk()
# Check result
enough, _ratio = nzo.check_quality()
enough, _ratio = nzo.check_availability_ratio()
if enough:
# Enough data present, do real download
self.cleanup_nzo(nzo, keep_basic=True)

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -272,13 +272,13 @@ class NzbFile(TryList):
if self.valid and self.nzf_id:
# Save first article seperate, but not for all but first par2 file
# Non-par2 files and the first par2 will have no volume and block number
# When DirectUnpack is disabled, do not do any of this to also preserve disk IO
setname, vol, block = sabnzbd.par2file.analyse_par2(self.filename)
if cfg.direct_unpack() and not vol and not block:
if 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)
self.nzo.first_articles_count += 1
# Any articles left?
if article_db:
@@ -578,7 +578,7 @@ NzbObjectSaver = (
'futuretype', 'deleted', 'parsed', 'action_line', 'unpack_info', 'fail_msg', 'nzo_info',
'custom_name', 'password', 'next_save', 'save_timeout', 'encrypted', 'bad_articles',
'duplicate', 'oversized', 'precheck', 'incomplete', 'reuse', 'meta', 'first_articles',
'md5sum', 'servercount', 'unwanted_ext', 'renames', 'rating_filtered'
'first_articles_count', 'md5sum', 'servercount', 'unwanted_ext', 'renames', 'rating_filtered'
)
# Lock to prevent errors when saving the NZO data
@@ -672,6 +672,7 @@ class NzbObject(TryList):
self.avg_bps_total = 0
self.first_articles = []
self.first_articles_count = 0
self.saved_articles = []
self.nzo_id = None
@@ -1137,6 +1138,8 @@ class NzbObject(TryList):
@synchronized(NZO_LOCK)
def remove_article(self, article, found):
""" Remove article from the NzbFile and do check if it can succeed"""
job_can_succeed = True
nzf = article.nzf
# First or regular article?
@@ -1144,8 +1147,14 @@ class NzbObject(TryList):
self.first_articles.remove(article)
# All first articles done?
if not self.first_articles and self.md5of16k:
self.verify_all_filenames_and_resort()
if not self.first_articles:
# Do we have rename information from par2
if self.md5of16k:
self.verify_all_filenames_and_resort()
# Check the availability of these first articles
if cfg.fail_hopeless_jobs() and cfg.fast_fail():
job_can_succeed = self.check_first_article_availability()
# Remove from file-tracking
file_done = nzf.remove_article(article, found)
@@ -1157,14 +1166,18 @@ class NzbObject(TryList):
# 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]:
# set the nzo status to return "Queued"
self.status = Status.QUEUED
self.set_download_report()
self.fail_msg = T('Aborted, cannot be completed') + ' - https://sabnzbd.org/not-complete'
self.set_unpack_info('Download', self.fail_msg, unique=False)
logging.debug('Abort job "%s", due to impossibility to complete it', self.final_name_pw_clean)
return True, True
if not self.reuse and cfg.fail_hopeless_jobs():
job_can_succeed, _ratio = self.check_availability_ratio(99)
# Abort the job due to failure
if not job_can_succeed:
# Set the nzo status to return "Queued"
self.status = Status.QUEUED
self.set_download_report()
self.fail_msg = T('Aborted, cannot be completed') + ' - https://sabnzbd.org/not-complete'
self.set_unpack_info('Download', self.fail_msg, unique=False)
logging.debug('Abort job "%s", due to impossibility to complete it', self.final_name_pw_clean)
return True, True
if not found:
# Add extra parfiles when there was a damaged article and not pre-checking
@@ -1425,7 +1438,7 @@ class NzbObject(TryList):
if self.direct_unpacker:
self.direct_unpacker.abort()
def check_quality(self, req_ratio=0):
def check_availability_ratio(self, req_ratio=0):
""" Determine amount of articles present on servers
and return (gross available, nett) bytes
"""
@@ -1457,48 +1470,69 @@ class NzbObject(TryList):
logging.debug('Download Quality: enough=%s, have=%s, need=%s, ratio=%s', enough, have, need, ratio)
return enough, ratio
def check_first_article_availability(self):
""" Use the first articles to see if
it's likely the job will succeed
"""
# Ignore this check on retry
if not self.reuse:
# Ignore undamaged or small downloads
if self.bad_articles and self.first_articles_count >= 10:
# We need a float-division, see if more than 80% is there
if (self.first_articles_count / float(self.bad_articles)) >= 0.8:
return False
return True
@synchronized(NZO_LOCK)
def set_download_report(self):
""" Format the stats for the history information """
# Pretty-format the per-server stats
if self.servercount:
# Sort the servers first
servers = config.get_servers()
server_names = sorted(servers.keys(), key=lambda svr: '%d%02d%s' % (int(not servers[svr].enable()), servers[svr].priority(), servers[svr].displayname().lower()))
msgs = ['%s=%sB' % (servers[server_name].displayname(), to_units(self.servercount[server_name])) for server_name in server_names if server_name in self.servercount]
self.set_unpack_info('Servers', ', '.join(msgs), unique=True)
# In case there were no bytes available at all of this download
# we list the number of bytes we used while trying
if not self.bytes_downloaded:
self.bytes_downloaded = sum(self.servercount.values())
# Format information about the download itself
download_msgs = []
if self.avg_bps_total and self.bytes_downloaded and self.avg_bps_freq:
# get the deltatime since the download started
# Get the deltatime since the download started
avg_bps = self.avg_bps_total / self.avg_bps_freq
timecompleted = datetime.timedelta(seconds=self.bytes_downloaded / (avg_bps * 1024))
seconds = timecompleted.seconds
# find the total time including days
# Find the total time including days
totaltime = (timecompleted.days / 86400) + seconds
self.nzo_info['download_time'] = totaltime
# format the total time the download took, in days, hours, and minutes, or seconds.
# Format the total time the download took, in days, hours, and minutes, or seconds.
complete_time = format_time_string(seconds, timecompleted.days)
download_msgs.append(T('Downloaded in %s at an average of %sB/s') % (complete_time, to_units(avg_bps * 1024)))
download_msgs.append(T('Age') + ': ' + calc_age(self.avg_date, True))
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)
miss = self.nzo_info.get('missing_articles', 0)
killed = self.nzo_info.get('killed_articles', 0)
dups = self.nzo_info.get('duplicate_articles', 0)
bad = self.nzo_info.get('bad_articles', 0)
miss = self.nzo_info.get('missing_articles', 0)
killed = self.nzo_info.get('killed_articles', 0)
dups = self.nzo_info.get('duplicate_articles', 0)
msg2 = msg3 = msg4 = msg5 = ''
if bad:
msg2 = (u'<br/>' + T('%s articles were malformed')) % bad
if miss:
msg3 = (u'<br/>' + T('%s articles were missing')) % miss
if dups:
msg4 = (u'<br/>' + T('%s articles had non-matching duplicates')) % dups
if killed:
msg5 = (u'<br/>' + T('%s articles were removed')) % killed
msg = u''.join((msg1, msg2, msg3, msg4, msg5, ))
self.set_unpack_info('Download', msg, unique=True)
if self.url:
self.set_unpack_info('Source', self.url, unique=True)
if bad:
download_msgs.append(T('%s articles were malformed') % bad)
if miss:
download_msgs.append(T('%s articles were missing') % miss)
if dups:
download_msgs.append(T('%s articles had non-matching duplicates') % dups)
if killed:
download_msgs.append(T('%s articles were removed') % killed)
self.set_unpack_info('Download', u'<br/>'.join(download_msgs), unique=True)
if len(self.servercount) > 0:
# Sort the servers first
servers = config.get_servers()
server_names = sorted(servers.keys(), key=lambda svr: '%d%02d%s' % (int(not servers[svr].enable()), servers[svr].priority(), servers[svr].displayname().lower()))
msgs = ['%s=%sB' % (servers[server_name].displayname(), to_units(self.servercount[server_name])) for server_name in server_names if server_name in self.servercount]
self.set_unpack_info('Servers', ', '.join(msgs), unique=True)
if self.url:
self.set_unpack_info('Source', self.url, unique=True)
@synchronized(NZO_LOCK)
def increase_bad_articles_counter(self, article_type):
@@ -1750,7 +1784,6 @@ class NzbObject(TryList):
remove_dir(self.downpath)
except:
logging.debug('Folder not removed: %s', self.downpath)
pass
def gather_info(self, full=False):
queued_files = []
@@ -1904,6 +1937,7 @@ class NzbObject(TryList):
self.renames = {}
if self.bad_articles is None:
self.bad_articles = 0
self.first_articles_count = 0
if self.bytes_missing is None:
self.bytes_missing = 0
if self.bytes_tried is None:

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -165,8 +165,9 @@ def parse_par2_file_packet(f, header):
filename = data[offset + 72:].strip('\0')
return filename, hash, hash16k
elif data[offset:offset + 15] == PAR_CREATOR_ID:
# Here untill the end is the creator-text
# Usefull in case of bugs in the par2-creating software
logging.debug('Par2-creator of %s is: %s', os.path.basename(f.name), data[offset+16:])
# From here until the end is the creator-text
# Useful in case of bugs in the par2-creating software
par2creator = data[offset+16:].strip('\0') # Remove any trailing \0
logging.debug('Par2-creator of %s is: %s', os.path.basename(f.name), par2creator)
return nothing

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -311,7 +311,7 @@ def process_job(nzo):
# if no files are present (except __admin__), fail the job
if all_ok and len(globber(workdir)) < 2:
if nzo.precheck:
_enough, ratio = nzo.check_quality()
_enough, ratio = nzo.check_availability_ratio()
req_ratio = float(cfg.req_completion_rate()) / 100.0
# Make sure that rounded ratio doesn't equal required ratio
# when it is actually below required
@@ -376,19 +376,16 @@ def process_job(nzo):
newfiles = []
# Run Stage 2: Unpack
if flag_unpack:
if all_ok:
# set the current nzo status to "Extracting...". Used in History
nzo.status = Status.EXTRACTING
logging.info("Running unpack_magic on %s", filename)
unpack_error, newfiles = unpack_magic(nzo, workdir, tmp_workdir_complete, flag_delete, one_folder, (), (), (), (), ())
logging.info("Unpacked files %s", newfiles)
# set the current nzo status to "Extracting...". Used in History
nzo.status = Status.EXTRACTING
logging.info("Running unpack_magic on %s", filename)
unpack_error, newfiles = unpack_magic(nzo, workdir, tmp_workdir_complete, flag_delete, one_folder, (), (), (), (), ())
logging.info("Unpacked files %s", newfiles)
if sabnzbd.WIN32:
# Sanitize the resulting files
newfiles = sanitize_files_in_folder(tmp_workdir_complete)
logging.info("Finished unpack_magic on %s", filename)
else:
nzo.set_unpack_info('Unpack', T('No post-processing because of failed verification'))
if sabnzbd.WIN32:
# Sanitize the resulting files
newfiles = sanitize_files_in_folder(tmp_workdir_complete)
logging.info("Finished unpack_magic on %s", filename)
if cfg.safe_postproc():
all_ok = all_ok and not unpack_error
@@ -449,7 +446,6 @@ def process_job(nzo):
else:
workdir_complete = tmp_workdir_complete.replace('_UNPACK_', '_FAILED_')
workdir_complete = get_unique_path(workdir_complete, n=0, create_dir=False)
workdir_complete = workdir_complete
if empty:
job_result = -1

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License

View File

@@ -1,5 +1,5 @@
#!/usr/bin/python -OO
# Copyright 2007-2018 The SABnzbd-Team <team@sabnzbd.org>
# Copyright 2007-2019 The SABnzbd-Team <team@sabnzbd.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -287,7 +287,7 @@ class RSSQueue(object):
status = feed_parsed.get('status', 999)
if status in (401, 402, 403):
msg = T('Do not have valid authentication for feed %s') % feed
msg = T('Do not have valid authentication for feed %s') % uri
logging.info(msg)
if 500 <= status <= 599:
@@ -301,11 +301,14 @@ class RSSQueue(object):
msg = T('Server %s uses an untrusted HTTPS certificate') % get_urlbase(uri)
msg += ' - https://sabnzbd.org/certificate-errors'
logging.error(msg)
elif 'href' in feed_parsed and feed_parsed['href'] != uri and 'login' in feed_parsed['href']:
# Redirect to login page!
msg = T('Do not have valid authentication for feed %s') % uri
else:
msg = T('Failed to retrieve RSS from %s: %s') % (uri, xml_name(msg))
logging.info(msg)
if not entries:
if not entries and not msg:
msg = T('RSS Feed %s was empty') % uri
logging.info(msg)
all_entries.extend(entries)
@@ -330,7 +333,7 @@ class RSSQueue(object):
if readout:
try:
link, category, size, age, season, episode = _get_link(entry)
link, infourl, category, size, age, season, episode = _get_link(entry)
except (AttributeError, IndexError):
logging.info(T('Incompatible feed') + ' ' + uri)
logging.info("Traceback: ", exc_info=True)
@@ -350,6 +353,7 @@ class RSSQueue(object):
continue
else:
link = entry
infourl = jobs[link].get('infourl', '')
category = jobs[link].get('orgcat', '')
if category in ('', '*'):
category = None
@@ -478,13 +482,13 @@ class RSSQueue(object):
else:
star = first
if result:
_HandleLink(jobs, feed, link, title, size, age, season, episode, 'G', category, myCat, myPP,
myScript, act, star, priority=myPrio, rule=str(n))
_HandleLink(jobs, feed, link, infourl, title, size, age, season, episode, 'G', category, myCat,
myPP, myScript, act, star, priority=myPrio, rule=str(n))
if act:
new_downloads.append(title)
else:
_HandleLink(jobs, feed, link, title, size, age, season, episode, 'B', category, myCat, myPP,
myScript, False, star, priority=myPrio, rule=str(n))
_HandleLink(jobs, feed, link, infourl, title, size, age, season, episode, 'B', category, myCat,
myPP, myScript, False, star, priority=myPrio, rule=str(n))
# Send email if wanted and not "forced"
if new_downloads and cfg.email_rss() and not force:
@@ -584,7 +588,7 @@ class RSSQueue(object):
return ''
def _HandleLink(jobs, feed, link, title, size, age, season, episode, flag, orgcat, cat, pp, script,
def _HandleLink(jobs, feed, link, infourl, title, size, age, season, episode, flag, orgcat, cat, pp, script,
download, star, priority=NORMAL_PRIORITY, rule=0):
""" Process one link """
if script == '':
@@ -595,6 +599,7 @@ def _HandleLink(jobs, feed, link, title, size, age, season, episode, flag, orgca
jobs[link] = {}
jobs[link]['title'] = title
jobs[link]['url'] = link
jobs[link]['infourl'] = infourl
jobs[link]['cat'] = cat
jobs[link]['pp'] = pp
jobs[link]['script'] = script
@@ -641,6 +646,11 @@ def _get_link(entry):
except:
pass
# GUID usually has URL to result on page
infourl = None
if entry.get('id') and entry.id != link and entry.id.startswith('http'):
infourl = entry.id
if size == 0L:
_RE_SIZE1 = re.compile(r'Size:\s*(\d+\.\d+\s*[KMG]{0,1})B\W*', re.I)
_RE_SIZE2 = re.compile(r'\W*(\d+\.\d+\s*[KMG]{0,1})B\W*', re.I)
@@ -690,10 +700,10 @@ def _get_link(entry):
except:
category = ''
return link, category, size, age, season, episode
return link, infourl, category, size, age, season, episode
else:
logging.warning(T('Empty RSS entry found (%s)'), link)
return None, '', 0L, None, 0, 0
return None, None, '', 0L, None, 0, 0
def special_rss_site(url):

Some files were not shown because too many files have changed in this diff Show More