|
@ -85,11 +85,11 @@ import sabnzbd.cfg as cfg |
|
|
import sabnzbd.nzbparser |
|
|
import sabnzbd.nzbparser |
|
|
from sabnzbd.downloader import Server |
|
|
from sabnzbd.downloader import Server |
|
|
from sabnzbd.database import HistoryDB |
|
|
from sabnzbd.database import HistoryDB |
|
|
from sabnzbd.deobfuscate_filenames import * |
|
|
from sabnzbd.deobfuscate_filenames import is_probably_obfuscated |
|
|
|
|
|
|
|
|
# Name patterns |
|
|
# Name patterns |
|
|
SUBJECT_FN_MATCHER = re.compile(r'"([^"]*)"') |
|
|
RE_SUBJECT_FILENAME_QUOTES = re.compile(r'"([^"]*)"') # In the subject, we expect the filename within double quotes |
|
|
RE_NORMAL_NAME = re.compile(r"\.\w{1,5}$") # Test reasonably sized extension at the end |
|
|
RE_SUBJECT_BASIC_FILENAME = re.compile(r"([\w\-+()'\s.,]*\.\w{2,4})") # Otherwise something that looks like a filename |
|
|
RE_RAR = re.compile(r"(\.rar|\.r\d\d|\.s\d\d|\.t\d\d|\.u\d\d|\.v\d\d)$", re.I) |
|
|
RE_RAR = re.compile(r"(\.rar|\.r\d\d|\.s\d\d|\.t\d\d|\.u\d\d|\.v\d\d)$", re.I) |
|
|
RE_PROPER = re.compile(r"(^|[\. _-])(PROPER|REAL|REPACK)([\. _-]|$)") |
|
|
RE_PROPER = re.compile(r"(^|[\. _-])(PROPER|REAL|REPACK)([\. _-]|$)") |
|
|
|
|
|
|
|
@ -326,7 +326,7 @@ class NzbFile(TryList): |
|
|
self.date: datetime.datetime = date |
|
|
self.date: datetime.datetime = date |
|
|
self.subject: str = subject |
|
|
self.subject: str = subject |
|
|
self.type: Optional[str] = None |
|
|
self.type: Optional[str] = None |
|
|
self.filename: str = name_extractor(subject) |
|
|
self.filename: str = sanitize_filename(name_extractor(subject)) |
|
|
self.filename_checked = False |
|
|
self.filename_checked = False |
|
|
self.filepath: Optional[str] = None |
|
|
self.filepath: Optional[str] = None |
|
|
|
|
|
|
|
@ -2123,10 +2123,20 @@ def scan_password(name: str) -> Tuple[str, Optional[str]]: |
|
|
def name_extractor(subject: str) -> str: |
|
|
def name_extractor(subject: str) -> str: |
|
|
""" Try to extract a file name from a subject line, return `subject` if in doubt """ |
|
|
""" Try to extract a file name from a subject line, return `subject` if in doubt """ |
|
|
result = subject |
|
|
result = subject |
|
|
for name in re.findall(SUBJECT_FN_MATCHER, subject): |
|
|
# Filename nicely wrapped in quotes |
|
|
|
|
|
for name in re.findall(RE_SUBJECT_FILENAME_QUOTES, subject): |
|
|
name = name.strip(' "') |
|
|
name = name.strip(' "') |
|
|
if name and RE_NORMAL_NAME.search(name): |
|
|
if name: |
|
|
result = name |
|
|
result = name |
|
|
|
|
|
|
|
|
|
|
|
# Found nothing? Try a basic filename-like search |
|
|
|
|
|
if result == subject: |
|
|
|
|
|
for name in re.findall(RE_SUBJECT_BASIC_FILENAME, subject): |
|
|
|
|
|
name = name.strip() |
|
|
|
|
|
if name: |
|
|
|
|
|
result = name |
|
|
|
|
|
|
|
|
|
|
|
# Return the subject |
|
|
return result |
|
|
return result |
|
|
|
|
|
|
|
|
|
|
|
|
|
|