def isRarSupported(): """ Test Packing Support: - Simulating in memory rar extraction on test.rar file """ try: rar_path = os.path.join(app.PROG_DIR, 'lib', 'unrar2', 'test.rar') testing = RarFile(rar_path).read_files('*test.txt') if testing[0][1] == 'This is only a test.': return 'supported' logger.log('Rar Not Supported: Can not read the content of test file', logger.ERROR) return 'not supported' except Exception as msg: logger.log('Rar Not Supported: {error}'.format(error=ex(msg)), logger.ERROR) return 'not supported'
def unRAR(path, rarFiles, force, result): unpacked_files = [] if sickbeard.UNPACK and rarFiles: result.output += logHelper(u"Packed Releases detected: " + str(rarFiles), logger.DEBUG) for archive in rarFiles: result.output += logHelper(u"Unpacking archive: " + archive, logger.DEBUG) try: rar_handle = RarFile(os.path.join(path, archive)) # Skip extraction if any file in archive has previously been extracted skip_file = False for file_in_archive in [os.path.basename(x.filename) for x in rar_handle.infolist() if not x.isdir]: if already_postprocessed(path, file_in_archive, force, result): result.output += logHelper( u"Archive file already post-processed, extraction skipped: " + file_in_archive, logger.DEBUG) skip_file = True break if skip_file: continue rar_handle.extract(path=path, withSubpath=False, overwrite=False) for x in rar_handle.infolist(): if not x.isdir: basename = os.path.basename(x.filename) if basename not in unpacked_files: unpacked_files.append(basename) del rar_handle except FatalRARError: result.output += logHelper(u"Failed Unrar archive {0}: Unrar: Fatal Error".format(archive), logger.ERROR) result.result = False result.missedfiles.append(archive + " : Fatal error unpacking archive") continue except CRCRARError: result.output += logHelper(u"Failed Unrar archive {0}: Unrar: Archive CRC Error".format(archive), logger.ERROR) result.result = False result.missedfiles.append(archive + " : CRC error unpacking archive") continue except IncorrectRARPassword: result.output += logHelper(u"Failed Unrar archive {0}: Unrar: Invalid Password".format(archive), logger.ERROR) result.result = False result.missedfiles.append(archive + " : Password protected RAR") continue except NoFileToExtract: result.output += logHelper(u"Failed Unrar archive {0}: Unrar: No file extracted, check the parent folder and destination file permissions.".format(archive), logger.ERROR) result.result = False result.missedfiles.append(archive + " : Nothing was unpacked (file permissions?)") continue except GenericRARError: result.output += logHelper(u"Failed Unrar archive {0}: Unrar: Generic Error".format(archive), logger.ERROR) result.result = False result.missedfiles.append(archive + " : Unpacking Failed with a Generic Error") continue except Exception, e: result.output += logHelper(u"Failed Unrar archive " + archive + ': ' + ex(e), logger.ERROR) result.result = False result.missedfiles.append(archive + " : Unpacking failed for an unknown reason") continue result.output += logHelper(u"UnRar content: " + str(unpacked_files), logger.DEBUG)
def unrar(self, path, rar_files, force=False): """ Extract RAR files. :param path: Path to look for files in :param rar_files: Names of RAR files :param force: process currently processing items :return: List of unpacked file names """ unpacked_files = [] if app.UNPACK and rar_files: self._log('Packed files detected: {0}'.format(rar_files), logger.DEBUG) for archive in rar_files: self._log('Unpacking archive: {0}'.format(archive), logger.DEBUG) failure = None try: rar_handle = RarFile(os.path.join(path, archive)) # Skip extraction if any file in archive has previously been extracted skip_extraction = False for file_in_archive in [ os.path.basename(each.filename) for each in rar_handle.infolist() if not each.isdir ]: if not force and self.already_postprocessed( file_in_archive): self._log( 'Archive file already post-processed, extraction skipped: {0}' .format(file_in_archive), logger.DEBUG) skip_extraction = True break if app.POSTPONE_IF_NO_SUBS and os.path.isfile( os.path.join(path, file_in_archive)): self._log( 'Archive file already extracted, extraction skipped: {0}' .format(file_in_archive), logger.DEBUG) skip_extraction = True break if not skip_extraction: rar_handle.extract(path=path, withSubpath=False, overwrite=False) for each in rar_handle.infolist(): if not each.isdir: basename = os.path.basename(each.filename) unpacked_files.append(basename) del rar_handle except ArchiveHeaderBroken: failure = ( 'Archive Header Broken', 'Unpacking failed because the Archive Header is Broken' ) except IncorrectRARPassword: failure = ( 'Incorrect RAR Password', 'Unpacking failed because of an Incorrect Rar Password' ) except FileOpenError: failure = ( 'File Open Error, check the parent folder and destination file permissions.', 'Unpacking failed with a File Open Error (file permissions?)' ) except InvalidRARArchiveUsage: failure = ( 'Invalid Rar Archive Usage', 'Unpacking Failed with Invalid Rar Archive Usage') except InvalidRARArchive: failure = ( 'Invalid Rar Archive', 'Unpacking Failed with an Invalid Rar Archive Error') except Exception as error: failure = (ex(error), 'Unpacking failed for an unknown reason') if failure is not None: self._log( 'Failed unpacking archive {0}: {1}'.format( archive, failure[0]), logger.WARNING) self.missedfiles.append( '{0}: Unpacking failed: {1}'.format( archive, failure[1])) self.result = False continue self._log('Extracted content: {0}'.format(unpacked_files), logger.DEBUG) return unpacked_files
def unRAR(path, rarFiles, force, result): """ Extracts RAR files :param path: Path to look for files in :param rarFiles: Names of RAR files :param force: process currently processing items :param result: Previous results :return: List of unpacked file names """ unpacked_files = [] if sickbeard.UNPACK and rarFiles: result.output += logHelper( "Packed Releases detected: " + str(rarFiles), logging.DEBUG) for archive in rarFiles: result.output += logHelper("Unpacking archive: " + archive, logging.DEBUG) try: rar_handle = RarFile(ek(os.path.join, path, archive)) # Skip extraction if any file in archive has previously been extracted skip_file = False for file_in_archive in [ ek(os.path.basename, x.filename) for x in rar_handle.infolist() if not x.isdir ]: if already_postprocessed(path, file_in_archive, force, result): result.output += logHelper( "Archive file already post-processed, extraction skipped: " + file_in_archive, logging.DEBUG) skip_file = True break if skip_file: continue rar_handle.extract(path=path, withSubpath=False, overwrite=False) for x in rar_handle.infolist(): if not x.isdir: basename = ek(os.path.basename, x.filename) if basename not in unpacked_files: unpacked_files.append(basename) del rar_handle except ArchiveHeaderBroken as e: result.output += logHelper( "Failed Unrar archive {0}: Unrar: Archive Header Broken". format(archive), logging.ERROR) result.result = False result.missedfiles.append( archive + " : Unpacking failed because the Archive Header is Broken") continue except IncorrectRARPassword: result.output += logHelper( "Failed Unrar archive {0}: Unrar: Incorrect Rar Password". format(archive), logging.ERROR) result.result = False result.missedfiles.append( archive + " : Unpacking failed because of an Incorrect Rar Password") continue except FileOpenError: result.output += logHelper( "Failed Unrar archive {0}: Unrar: File Open Error, check the parent folder and destination file permissions." .format(archive), logging.ERROR) result.result = False result.missedfiles.append( archive + " : Unpacking failed with a File Open Error (file permissions?)" ) continue except InvalidRARArchiveUsage: result.output += logHelper( "Failed Unrar archive {0}: Unrar: Invalid Rar Archive Usage" .format(archive), logging.ERROR) result.result = False result.missedfiles.append( archive + " : Unpacking Failed with Invalid Rar Archive Usage") continue except InvalidRARArchive: result.output += logHelper( "Failed Unrar archive {0}: Unrar: Invalid Rar Archive". format(archive), logging.ERROR) result.result = False result.missedfiles.append( archive + " : Unpacking Failed with an Invalid Rar Archive Error") continue except Exception as e: result.output += logHelper( "Failed Unrar archive " + archive + ': ' + ex(e), logging.ERROR) result.result = False result.missedfiles.append( archive + " : Unpacking failed for an unknown reason") continue result.output += logHelper("UnRar content: " + str(unpacked_files), logging.DEBUG) return unpacked_files
def unRAR(path, rarFiles, force, result): # pylint: disable=too-many-branches,too-many-statements """ Extracts RAR files :param path: Path to look for files in :param rarFiles: Names of RAR files :param force: process currently processing items :param result: Previous results :return: List of unpacked file names """ unpacked_files = [] if sickbeard.UNPACK and rarFiles: result.output += logHelper(u"Packed Releases detected: %s" % rarFiles, logger.DEBUG) for archive in rarFiles: result.output += logHelper(u"Unpacking archive: %s" % archive, logger.DEBUG) failure = None try: rar_handle = RarFile(ek(os.path.join, path, archive)) # Skip extraction if any file in archive has previously been extracted skip_file = False for file_in_archive in [ ek(os.path.basename, x.filename) for x in rar_handle.infolist() if not x.isdir ]: if already_postprocessed(path, file_in_archive, force, result): result.output += logHelper( u"Archive file already post-processed, extraction skipped: %s" % file_in_archive, logger.DEBUG) skip_file = True break if skip_file: continue rar_handle.extract(path=path, withSubpath=False, overwrite=False) for x in rar_handle.infolist(): if not x.isdir: basename = ek(os.path.basename, x.filename) if basename not in unpacked_files: unpacked_files.append(basename) del rar_handle except ArchiveHeaderBroken: failure = ( u'Archive Header Broken', u'Unpacking failed because the Archive Header is Broken') except IncorrectRARPassword: failure = ( u'Incorrect RAR Password', u'Unpacking failed because of an Incorrect Rar Password') except FileOpenError: failure = ( u'File Open Error, check the parent folder and destination file permissions.', u'Unpacking failed with a File Open Error (file permissions?)' ) except InvalidRARArchiveUsage: failure = (u'Invalid Rar Archive Usage', u'Unpacking Failed with Invalid Rar Archive Usage') except InvalidRARArchive: failure = ( u'Invalid Rar Archive', u'Unpacking Failed with an Invalid Rar Archive Error') except Exception as e: failure = (ex(e), u'Unpacking failed for an unknown reason') if failure is not None: result.output += logHelper( u'Failed Unrar archive {}: {}'.format(archive, failure[0]), logger.ERROR) result.missedfiles.append(u'{} : Unpacking failed: {}'.format( archive, failure[1])) result.result = False continue result.output += logHelper(u"UnRar content: %s" % unpacked_files, logger.DEBUG) return unpacked_files