def test_nzo_basic(self): # Need to create the Default category, as we would in normal instance # Otherwise it will try to save the config def_cat = ConfigCat("*", { "pp": 3, "script": "None", "priority": NORMAL_PRIORITY }) # Create empty object, normally used to grab URL's nzo = nzbstuff.NzbObject("test_basic") assert nzo.work_name == "test_basic" assert not nzo.files assert not nzo.created # Create NZB-file to import nzb_path = create_nzb("basic_rar5") with open(nzb_path, "r") as nzb_data_fp: nzb_data = nzb_data_fp.read() # Remove the created NZB-file os.remove(nzb_path) # Very basic test of NZO creation with data nzo = nzbstuff.NzbObject("test_basic_data", nzb=nzb_data) assert nzo.final_name == "test_basic_data" assert nzo.files assert nzo.files[0].filename == "testfile.rar" assert nzo.bytes == 120 assert nzo.files[0].bytes == 120 # work_name can be trimmed in Windows due to max-path-length assert "test_basic_data".startswith(nzo.work_name) assert os.path.exists(nzo.workpath) # Check if there's an nzf file and the backed-up nzb assert globber(nzo.workpath, "*.nzb.gz") assert globber(nzo.workpath, "SABnzbd_nzf*") # Should have picked up the default category settings assert nzo.cat == "*" assert nzo.script == def_cat.script() == "None" assert nzo.priority == def_cat.priority() == NORMAL_PRIORITY assert nzo.repair and nzo.unpack and nzo.delete
def ProcessSingleFile(filename, path, pp=None, script=None, cat=None, catdir=None, keep=False, priority=None, nzbname=None, reuse=False, nzo_info=None, dup_check=True, url='', password=None, nzo_id=None): """ Analyze file and create a job from it Supports NZB, NZB.BZ2, NZB.GZ and GZ.NZB-in-disguise returns (status, nzo_ids) status: -2==Error/retry, -1==Error, 0==OK, 1==OK-but-ignorecannot-delete """ nzo_ids = [] if catdir is None: catdir = cat try: f = open(path, 'rb') b1 = f.read(1) b2 = f.read(1) f.close() if b1 == '\x1f' and b2 == '\x8b': # gzip file or gzip in disguise name = filename.replace('.nzb.gz', '.nzb') f = gzip.GzipFile(path, 'rb') elif b1 == 'B' and b2 == 'Z': # bz2 file or bz2 in disguise name = filename.replace('.nzb.bz2', '.nzb') f = bz2.BZ2File(path, 'rb') else: name = filename f = open(path, 'rb') data = f.read() f.close() except: logging.warning(T('Cannot read %s'), misc.clip_path(path)) logging.info("Traceback: ", exc_info=True) return -2, nzo_ids if name: name, cat = name_to_cat(name, catdir) # The name is used as the name of the folder, so sanitize it using folder specific santization if not nzbname: # Prevent embedded password from being damaged by sanitize and trimming nzbname = os.path.split(name)[1] try: nzo = nzbstuff.NzbObject(name, pp, script, data, cat=cat, priority=priority, nzbname=nzbname, nzo_info=nzo_info, url=url, reuse=reuse, dup_check=dup_check) if not nzo.password: nzo.password = password except TypeError: # Duplicate, ignore if nzo_id: sabnzbd.nzbqueue.NzbQueue.do.remove(nzo_id, add_to_history=False) nzo = None except ValueError: # Empty, but correct file return -1, nzo_ids except: if data.find("<nzb") >= 0 > data.find("</nzb"): # Looks like an incomplete file, retry return -2, nzo_ids else: # Something else is wrong, show error logging.error(T('Error while adding %s, removing'), name, exc_info=True) return -1, nzo_ids if nzo: if nzo_id: # Re-use existing nzo_id, when a "future" job gets it payload sabnzbd.nzbqueue.NzbQueue.do.remove(nzo_id, add_to_history=False) nzo.nzo_id = nzo_id nzo_ids.append(sabnzbd.nzbqueue.NzbQueue.do.add(nzo, quiet=reuse)) nzo.update_rating() try: if not keep: misc.remove_file(path) except: logging.error(T('Error removing %s'), misc.clip_path(path)) logging.info("Traceback: ", exc_info=True) return 1, nzo_ids return 0, nzo_ids
def ProcessArchiveFile(filename, path, pp=None, script=None, cat=None, catdir=None, keep=False, priority=None, url='', nzbname=None, password=None, nzo_id=None): """ Analyse ZIP file and create job(s). Accepts ZIP files with ONLY nzb/nfo/folder files in it. returns (status, nzo_ids) status: -1==Error/Retry, 0==OK, 1==Ignore """ nzo_ids = [] if catdir is None: catdir = cat filename, cat = name_to_cat(filename, catdir) status, zf, extension = is_archive(path) if status != 0: return status, [] status = 1 names = zf.namelist() nzbcount = 0 for name in names: name = name.lower() if name.endswith('.nzb'): status = 0 nzbcount += 1 if status == 0: if nzbcount != 1: nzbname = None for name in names: if name.lower().endswith('.nzb'): try: data = zf.read(name) except: logging.error(T('Cannot read %s'), name, exc_info=True) zf.close() return -1, [] name = os.path.basename(name) if data: nzo = None try: nzo = nzbstuff.NzbObject(name, pp, script, data, cat=cat, url=url, priority=priority, nzbname=nzbname) if not nzo.password: nzo.password = password except (TypeError, ValueError): # Duplicate or empty, ignore pass except: # Something else is wrong, show error logging.error(T('Error while adding %s, removing'), name, exc_info=True) if nzo: if nzo_id: # Re-use existing nzo_id, when a "future" job gets it payload sabnzbd.nzbqueue.NzbQueue.do.remove( nzo_id, add_to_history=False) nzo.nzo_id = nzo_id nzo_id = None nzo_ids.append(sabnzbd.nzbqueue.NzbQueue.do.add(nzo)) nzo.update_rating() zf.close() try: if not keep: misc.remove_file(path) except: logging.error(T('Error removing %s'), misc.clip_path(path)) logging.info("Traceback: ", exc_info=True) status = 1 else: zf.close() status = 1 return status, nzo_ids
def ProcessArchiveFile(filename, path, pp=None, script=None, cat=None, catdir=None, keep=False, priority=None, url='', nzbname=None): """ Analyse ZIP file and create job(s). Accepts ZIP files with ONLY nzb/nfo/folder files in it. returns (status, nzo_ids) status: -1==Error/Retry, 0==OK, 1==Ignore """ from sabnzbd.nzbqueue import add_nzo nzo_ids = [] if catdir is None: catdir = cat filename, cat = name_to_cat(filename, catdir) if zipfile.is_zipfile(path): try: zf = zipfile.ZipFile(path) except: return -1, [] elif is_rarfile(path): try: zf = RarFile(path) except: return -1, [] else: return 1, [] status = 1 names = zf.namelist() names.sort() nzbcount = 0 for name in names: name = name.lower() if not (name.endswith('.nzb') or name.endswith('.nfo') or name.endswith('/')): status = 1 break elif name.endswith('.nzb'): status = 0 nzbcount += 1 if status == 0: if nzbcount != 1: nzbname = None for name in names: if name.lower().endswith('.nzb'): try: data = zf.read(name) except: zf.close() return -1, [] name = re.sub(r'\[.*nzbmatrix.com\]', '', name) name = os.path.basename(name) name = misc.sanitize_foldername(name) if data: try: nzo = nzbstuff.NzbObject(name, 0, pp, script, data, cat=cat, url=url, priority=priority, nzbname=nzbname) except: nzo = None if nzo: nzo_ids.append(add_nzo(nzo)) nzo.update_rating() zf.close() try: if not keep: os.remove(path) except: logging.error(Ta('Error removing %s'), path) logging.info("Traceback: ", exc_info = True) status = 1 else: zf.close() status = 1 return status, nzo_ids
def ProcessSingleFile(filename, path, pp=None, script=None, cat=None, catdir=None, keep=False, priority=None, nzbname=None, reuse=False, nzo_info=None, dup_check=True, url=''): """ Analyse file and create a job from it Supports NZB, NZB.GZ and GZ.NZB-in-disguise returns (status, nzo_ids) status: -2==Error/retry, -1==Error, 0==OK, 1==OK-but-ignorecannot-delete """ from sabnzbd.nzbqueue import add_nzo nzo_ids = [] if catdir is None: catdir = cat try: f = open(path, 'rb') b1 = f.read(1) b2 = f.read(1) f.close() if (b1 == '\x1f' and b2 == '\x8b'): # gzip file or gzip in disguise name = filename.replace('.nzb.gz', '.nzb') f = gzip.GzipFile(path, 'rb') else: name = filename f = open(path, 'rb') data = f.read() f.close() except: logging.warning(Ta('Cannot read %s'), path) logging.info("Traceback: ", exc_info = True) return -2, nzo_ids if name: name, cat = name_to_cat(name, catdir) # The name is used as the name of the folder, so sanitize it using folder specific santization if not nzbname: # Prevent embedded password from being damaged by sanitize and trimming nzbname = os.path.split(name)[1] name = misc.sanitize_foldername(name) try: nzo = nzbstuff.NzbObject(name, 0, pp, script, data, cat=cat, priority=priority, nzbname=nzbname, nzo_info=nzo_info, url=url, reuse=reuse, dup_check=dup_check) except TypeError: # Duplicate, ignore nzo = None except ValueError: # Empty, but correct file return -1, nzo_ids except: if data.find("<nzb") >= 0 and data.find("</nzb") < 0: # Looks like an incomplete file, retry return -2, nzo_ids else: return -1, nzo_ids if nzo: nzo_ids.append(add_nzo(nzo)) nzo.update_rating() try: if not keep: os.remove(path) except: logging.error(Ta('Error removing %s'), path) logging.info("Traceback: ", exc_info = True) return 1, nzo_ids return 0, nzo_ids
def process_single_nzb( filename, path, pp=None, script=None, cat=None, catdir=None, keep=False, priority=None, nzbname=None, reuse=None, nzo_info=None, dup_check=True, url=None, password=None, nzo_id=None, ): """Analyze file and create a job from it Supports NZB, NZB.BZ2, NZB.GZ and GZ.NZB-in-disguise returns (status, nzo_ids) status: -2==Error/retry, -1==Error, 0==OK """ nzo_ids = [] if catdir is None: catdir = cat try: with open(path, "rb") as nzb_file: check_bytes = nzb_file.read(2) if check_bytes == b"\x1f\x8b": # gzip file or gzip in disguise filename = filename.replace(".nzb.gz", ".nzb") nzb_reader_handler = gzip.GzipFile elif check_bytes == b"BZ": # bz2 file or bz2 in disguise filename = filename.replace(".nzb.bz2", ".nzb") nzb_reader_handler = bz2.BZ2File else: nzb_reader_handler = open # Let's get some data and hope we can decode it with nzb_reader_handler(path, "rb") as nzb_file: data = correct_unknown_encoding(nzb_file.read()) except OSError: logging.warning(T("Cannot read %s"), filesystem.clip_path(path)) logging.info("Traceback: ", exc_info=True) return -2, nzo_ids if filename: filename, cat = name_to_cat(filename, catdir) # The name is used as the name of the folder, so sanitize it using folder specific santization if not nzbname: # Prevent embedded password from being damaged by sanitize and trimming nzbname = get_filename(filename) try: nzo = nzbstuff.NzbObject( filename, pp=pp, script=script, nzb=data, cat=cat, url=url, priority=priority, nzbname=nzbname, nzo_info=nzo_info, reuse=reuse, dup_check=dup_check, ) if not nzo.password: nzo.password = password except TypeError: # Duplicate, ignore if nzo_id: sabnzbd.NzbQueue.remove(nzo_id) nzo = None except ValueError: # Empty return 1, nzo_ids except: if data.find("<nzb") >= 0 > data.find("</nzb"): # Looks like an incomplete file, retry return -2, nzo_ids else: # Something else is wrong, show error logging.error(T("Error while adding %s, removing"), filename, exc_info=True) return -1, nzo_ids if nzo: if nzo_id: # Re-use existing nzo_id, when a "future" job gets it payload sabnzbd.NzbQueue.remove(nzo_id, delete_all_data=False) nzo.nzo_id = nzo_id nzo_ids.append(sabnzbd.NzbQueue.add(nzo, quiet=reuse)) nzo.update_rating() try: if not keep: filesystem.remove_file(path) except OSError: # Job was still added to the queue, so throw error but don't report failed add logging.error(T("Error removing %s"), filesystem.clip_path(path)) logging.info("Traceback: ", exc_info=True) return 0, nzo_ids
def process_nzb_archive_file( filename, path, pp=None, script=None, cat=None, catdir=None, keep=False, priority=None, nzbname=None, reuse=None, nzo_info=None, dup_check=True, url=None, password=None, nzo_id=None, ): """Analyse ZIP file and create job(s). Accepts ZIP files with ONLY nzb/nfo/folder files in it. returns (status, nzo_ids) status: -1==Error, 0==OK, 1==Ignore """ nzo_ids = [] if catdir is None: catdir = cat filename, cat = name_to_cat(filename, catdir) # Returns -1==Error/Retry, 0==OK, 1==Ignore status, zf, extension = is_archive(path) if status != 0: return status, [] status = 1 names = zf.namelist() nzbcount = 0 for name in names: name = name.lower() if name.endswith(".nzb"): status = 0 nzbcount += 1 if status == 0: if nzbcount != 1: nzbname = None for name in names: if name.lower().endswith(".nzb"): try: data = correct_unknown_encoding(zf.read(name)) except OSError: logging.error(T("Cannot read %s"), name, exc_info=True) zf.close() return -1, [] name = filesystem.setname_from_path(name) if data: nzo = None try: nzo = nzbstuff.NzbObject( name, pp=pp, script=script, nzb=data, cat=cat, url=url, priority=priority, nzbname=nzbname, nzo_info=nzo_info, reuse=reuse, dup_check=dup_check, ) if not nzo.password: nzo.password = password except (TypeError, ValueError): # Duplicate or empty, ignore pass except: # Something else is wrong, show error logging.error(T("Error while adding %s, removing"), name, exc_info=True) if nzo: if nzo_id: # Re-use existing nzo_id, when a "future" job gets it payload sabnzbd.NzbQueue.remove(nzo_id, delete_all_data=False) nzo.nzo_id = nzo_id nzo_id = None nzo_ids.append(sabnzbd.NzbQueue.add(nzo)) nzo.update_rating() zf.close() try: if not keep: filesystem.remove_file(path) except OSError: logging.error(T("Error removing %s"), filesystem.clip_path(path)) logging.info("Traceback: ", exc_info=True) else: zf.close() status = 1 return status, nzo_ids
def ProcessArchiveFile(filename, path, pp=None, script=None, cat=None, catdir=None, keep=False, priority=None, url='', nzbname=None, password=None, nzo_id=None): """ Analyse ZIP file and create job(s). Accepts ZIP files with ONLY nzb/nfo/folder files in it. returns (status, nzo_ids) status: -1==Error/Retry, 0==OK, 1==Ignore """ from sabnzbd.nzbqueue import add_nzo nzo_ids = [] if catdir is None: catdir = cat filename, cat = name_to_cat(filename, catdir) if zipfile.is_zipfile(path): try: zf = zipfile.ZipFile(path) except: return -1, [] elif is_rarfile(path): try: zf = RarFile(path) except: return -1, [] elif is_sevenfile(path): try: zf = SevenZip(path) except: return -1, [] else: return 1, [] status = 1 names = zf.namelist() names.sort() nzbcount = 0 for name in names: name = name.lower() if not (name.endswith('.nzb') or name.endswith('.nfo') or name.endswith('/')): status = 1 break elif name.endswith('.nzb'): status = 0 nzbcount += 1 if status == 0: if nzbcount != 1: nzbname = None for name in names: if name.lower().endswith('.nzb'): try: data = zf.read(name) except: zf.close() return -1, [] name = os.path.basename(name) if data: try: nzo = nzbstuff.NzbObject(name, pp, script, data, cat=cat, url=url, priority=priority, nzbname=nzbname) if not nzo.password: nzo.password = password except: nzo = None if nzo: if nzo_id: # Re-use existing nzo_id, when a "future" job gets it payload sabnzbd.nzbqueue.NzbQueue.do.remove(nzo_id, add_to_history=False) nzo.nzo_id = nzo_id nzo_ids.append(add_nzo(nzo)) nzo.update_rating() zf.close() try: if not keep: os.remove(path) except: logging.error(T('Error removing %s'), misc.clip_path(path)) logging.info("Traceback: ", exc_info=True) status = 1 else: zf.close() status = 1 return status, nzo_ids