mirror of
https://github.com/sabnzbd/sabnzbd.git
synced 2026-01-31 10:52:15 -05:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
233bdd5b1d | ||
|
|
a0ab6d35c7 | ||
|
|
bd29680ce7 | ||
|
|
7139e92554 | ||
|
|
897df53466 | ||
|
|
58281711f6 | ||
|
|
b524383aa3 |
4
PKG-INFO
4
PKG-INFO
@@ -1,7 +1,7 @@
|
||||
Metadata-Version: 1.0
|
||||
Name: SABnzbd
|
||||
Version: 3.4.2RC1
|
||||
Summary: SABnzbd-3.4.2RC1
|
||||
Version: 3.4.2RC2
|
||||
Summary: SABnzbd-3.4.2RC2
|
||||
Home-page: https://sabnzbd.org
|
||||
Author: The SABnzbd Team
|
||||
Author-email: team@sabnzbd.org
|
||||
|
||||
@@ -1,12 +1,16 @@
|
||||
Release Notes - SABnzbd 3.4.2 Release Candidate 1
|
||||
Release Notes - SABnzbd 3.4.2 Release Candidate 2
|
||||
=========================================================
|
||||
|
||||
## Bugfixes since 3.4.1
|
||||
- Sorting requires at least 1 category te be selected since 3.4.0.
|
||||
Warning will be shown if no category is selected.
|
||||
- Job failure due to Sorting-problems was not shown in the History.
|
||||
- Crash when `.par2` files were missing during download.
|
||||
- Prevent scanning the whole file to identify the correct extension.
|
||||
- `.rXX` extensions were renamed to `.rXX.rar`.
|
||||
- `.rXX`, `.cbz` and `.cbr` extensions were wrongly renamed.
|
||||
- Processing unpacked `.par2` files would also process source
|
||||
`.par2` files and could result in duplicate (`.1`) filenames.
|
||||
- Always show number of MB missing during download.
|
||||
|
||||
## Bugfixes since 3.4.0
|
||||
- macOS: Failed to run on M1 systems or older macOS versions.
|
||||
|
||||
@@ -46,6 +46,8 @@ try:
|
||||
import portend
|
||||
import cryptography
|
||||
import chardet
|
||||
import guessit
|
||||
import puremagic
|
||||
except ImportError as e:
|
||||
print("Not all required Python modules are available, please check requirements.txt")
|
||||
print("Missing module:", e.name)
|
||||
@@ -1439,12 +1441,11 @@ def main():
|
||||
try:
|
||||
cherrypy.engine.start()
|
||||
except:
|
||||
# Since the webserver is started by cherrypy in a separate thread, we can't really catch any
|
||||
# start-up errors. This try/except only catches very few errors, the rest is only shown in the console.
|
||||
logging.error(T("Failed to start web-interface: "), exc_info=True)
|
||||
abort_and_show_error(browserhost, cherryport)
|
||||
|
||||
# Wait for server to become ready
|
||||
cherrypy.engine.wait(cherrypy.process.wspbus.states.STARTED)
|
||||
|
||||
if sabnzbd.WIN32:
|
||||
if enable_https:
|
||||
mode = "s"
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
<option value="$ct" <!--#if $ct in $getVar($section_label + '_cats') then 'selected="selected"' else ""#-->>$Tspec($ct)</option>
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
<p>$T('defaultNotifiesAll')</p>
|
||||
</div>
|
||||
<!--#end def#-->
|
||||
|
||||
@@ -40,6 +41,7 @@
|
||||
<option value="$ct" <!--#if $ct in $email_cats then 'selected="selected"' else ""#-->>$Tspec($ct)</option>
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
<p>$T('defaultNotifiesAll')</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col1">
|
||||
|
||||
@@ -11,12 +11,13 @@
|
||||
<h3>$T('seriesSorting') <a href="$helpuri$help_uri#toc0" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
|
||||
<p>
|
||||
<b>$T('affectedCat')</b><br/>
|
||||
<select name="tv_categories" multiple="multiple" class="multiple_cats">
|
||||
<select name="tv_categories" multiple="multiple" class="multiple_cats" required="required">
|
||||
<!--#for $ct in $categories#-->
|
||||
<option value="$ct" <!--#if $ct in $tv_categories then 'selected="selected"' else ""#--> >$Tspec($ct)</option>
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
</p>
|
||||
<p>$T('selectOneCat')</p>
|
||||
</div>
|
||||
<!-- /col2 -->
|
||||
<div class="col1">
|
||||
@@ -223,12 +224,13 @@
|
||||
<h3>$T('movieSort') <a href="$helpuri$help_uri#toc6" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
|
||||
<p>
|
||||
<b>$T('affectedCat')</b><br/>
|
||||
<select name="movie_categories" multiple="multiple" class="multiple_cats">
|
||||
<select name="movie_categories" multiple="multiple" class="multiple_cats" required="required">
|
||||
<!--#for $ct in $categories#-->
|
||||
<option value="$ct" <!--#if $ct in $movie_categories then 'selected="selected"' else ""#--> >$Tspec($ct)</option>
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
</p>
|
||||
<p>$T('selectOneCat')</p>
|
||||
</div>
|
||||
<!-- /col2 -->
|
||||
<div class="col1">
|
||||
@@ -419,12 +421,13 @@
|
||||
<h3>$T('dateSorting') <a href="$helpuri$help_uri#toc9" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></h3>
|
||||
<p>
|
||||
<b>$T('affectedCat')</b><br/>
|
||||
<select name="date_categories" multiple="multiple" class="multiple_cats">
|
||||
<select name="date_categories" multiple="multiple" class="multiple_cats" required="required">
|
||||
<!--#for $ct in $categories#-->
|
||||
<option value="$ct" <!--#if $ct in $date_categories then 'selected="selected"' else ""#--> >$Tspec($ct)</option>
|
||||
<!--#end for#-->
|
||||
</select>
|
||||
</p>
|
||||
<p>$T('selectOneCat')</p>
|
||||
</div>
|
||||
<!-- /col2 -->
|
||||
<div class="col1">
|
||||
|
||||
@@ -531,11 +531,10 @@ function QueueModel(parent, data) {
|
||||
return self.name()
|
||||
})
|
||||
self.missingText = ko.pureComputed(function() {
|
||||
// Check for missing data, the value is arbitrary! (1%)
|
||||
if(self.missingMB()/self.totalMB() > 0.01) {
|
||||
// Check for missing data, can show 0 if article-size is smaller than 500K, but we accept that
|
||||
if(self.missingMB()) {
|
||||
return self.missingMB().toFixed(0) + ' MB ' + glitterTranslate.misingArt
|
||||
}
|
||||
return;
|
||||
})
|
||||
self.statusText = ko.computed(function() {
|
||||
// Checking
|
||||
|
||||
@@ -233,7 +233,7 @@ rating_filter_pause_keywords = OptionStr("misc", "rating_filter_pause_keywords")
|
||||
##############################################################################
|
||||
enable_tv_sorting = OptionBool("misc", "enable_tv_sorting", False)
|
||||
tv_sort_string = OptionStr("misc", "tv_sort_string")
|
||||
tv_categories = OptionList("misc", "tv_categories", "")
|
||||
tv_categories = OptionList("misc", "tv_categories", ["tv"])
|
||||
|
||||
enable_movie_sorting = OptionBool("misc", "enable_movie_sorting", False)
|
||||
movie_sort_string = OptionStr("misc", "movie_sort_string")
|
||||
|
||||
@@ -515,6 +515,7 @@ def process_job(nzo: NzbObject):
|
||||
workdir_complete, ok = file_sorter.sorter.rename(newfiles, workdir_complete)
|
||||
if not ok:
|
||||
nzo.set_unpack_info("Unpack", T("Failed to move files"))
|
||||
nzo.fail_msg = T("Failed to move files")
|
||||
all_ok = False
|
||||
|
||||
# Run further post-processing
|
||||
|
||||
@@ -701,6 +701,9 @@ SKIN_TEXT = {
|
||||
"link-download": TT("Download"), #: Config->RSS button "download item"
|
||||
"button-rssNow": TT("Read All Feeds Now"), #: Config->RSS button
|
||||
# Config->Notifications
|
||||
"defaultNotifiesAll": TT(
|
||||
"If only the <em>Default</em> category is selected, notifications are enabled for jobs in all categories."
|
||||
),
|
||||
"opt-email_endjob": TT("Email Notification On Job Completion"),
|
||||
"email-never": TT("Never"), #: When to send email
|
||||
"email-always": TT("Always"), #: When to send email
|
||||
@@ -773,6 +776,7 @@ SKIN_TEXT = {
|
||||
"catTags": TT("Indexer Categories / Groups"),
|
||||
"button-delCat": TT("X"), #: Small delete button
|
||||
# Config->Sorting
|
||||
"selectOneCat": TT("Select at least 1 category."),
|
||||
"seriesSorting": TT("Series Sorting"),
|
||||
"opt-tvsort": TT("Enable TV Sorting"),
|
||||
"sort-legenda": TT("Pattern Key"),
|
||||
|
||||
@@ -305,7 +305,7 @@ class BaseSorter:
|
||||
except:
|
||||
logging.error(T("Failed to rename: %s to %s"), clip_path(current_path), clip_path(newpath))
|
||||
logging.info("Traceback: ", exc_info=True)
|
||||
rename_similar(current_path, ext, self.filename_set, ())
|
||||
rename_similar(current_path, ext, self.filename_set)
|
||||
else:
|
||||
logging.debug("Nothing to rename, %s", files)
|
||||
|
||||
@@ -363,6 +363,10 @@ class SeriesSorter(BaseSorter):
|
||||
self.matched = True
|
||||
self.type = "tv"
|
||||
|
||||
# Require at least 1 category, this was not enforced before 3.4.0
|
||||
if cfg.enable_tv_sorting() and not self.cats:
|
||||
logging.warning("%s: %s", T("Series Sorting"), T("Select at least 1 category."))
|
||||
|
||||
def get_values(self):
|
||||
"""Collect all values needed for path replacement"""
|
||||
self.get_year()
|
||||
@@ -426,6 +430,10 @@ class MovieSorter(BaseSorter):
|
||||
self.matched = True
|
||||
self.type = "movie"
|
||||
|
||||
# Require at least 1 category, this was not enforced before 3.4.0
|
||||
if cfg.enable_movie_sorting() and not self.cats:
|
||||
logging.warning("%s: %s", T("Movie Sorting"), T("Select at least 1 category."))
|
||||
|
||||
def get_values(self):
|
||||
"""Collect all values needed for path replacement"""
|
||||
self.get_year()
|
||||
@@ -506,6 +514,10 @@ class DateSorter(BaseSorter):
|
||||
self.matched = True
|
||||
self.type = "date"
|
||||
|
||||
# Require at least 1 category, this was not enforced before 3.4.0
|
||||
if cfg.enable_date_sorting() and not self.cats:
|
||||
logging.warning("%s: %s", T("Date Sorting"), T("Select at least 1 category."))
|
||||
|
||||
def get_date(self):
|
||||
"""Get month and day"""
|
||||
self.info["month"] = str(self.guess.get("date").month)
|
||||
@@ -794,7 +806,7 @@ def strip_path_elements(path: str) -> str:
|
||||
return "\\\\" + path if is_unc else path
|
||||
|
||||
|
||||
def rename_similar(folder: str, skip_ext: str, name: str, skipped_files: List[str]):
|
||||
def rename_similar(folder: str, skip_ext: str, name: str, skipped_files: Optional[List[str]] = None):
|
||||
"""Rename all other files in the 'folder' hierarchy after 'name'
|
||||
and move them to the root of 'folder'.
|
||||
Files having extension 'skip_ext' will be moved, but not renamed.
|
||||
@@ -807,7 +819,7 @@ def rename_similar(folder: str, skip_ext: str, name: str, skipped_files: List[st
|
||||
for root, dirs, files in os.walk(folder):
|
||||
for f in files:
|
||||
path = os.path.join(root, f)
|
||||
if path in skipped_files:
|
||||
if skipped_files and path in skipped_files:
|
||||
continue
|
||||
org, ext = os.path.splitext(f)
|
||||
if ext.lower() == skip_ext:
|
||||
|
||||
@@ -169,6 +169,8 @@ DOWNLOAD_EXT = (
|
||||
"bdmv",
|
||||
"bin",
|
||||
"bup",
|
||||
"cbr",
|
||||
"cbz",
|
||||
"clpi",
|
||||
"crx",
|
||||
"db",
|
||||
|
||||
Reference in New Issue
Block a user