Merge commit '17f74cf2968a4e0aa01d7309afe7e1407b8abef2' into comicstream-integr

This commit is contained in:
Davide Romanini 2015-02-16 14:09:21 +01:00
parent ceb089908d
commit 259769ae59

View File

@ -26,7 +26,51 @@ import tempfile
import subprocess
import platform
import locale
import shutil
from natsort import natsorted
from unrar import rarfile
from unrar import unrarlib
import unrar.constants
import ctypes
import io
from unrar import constants
class OpenableRarFile(rarfile.RarFile):
def open(self, member):
#print "opening %s..." % member
# based on https://github.com/matiasb/python-unrar/pull/4/files
res = []
if isinstance(member, rarfile.RarInfo):
member = member.filename
archive = unrarlib.RAROpenArchiveDataEx(self.filename, mode=constants.RAR_OM_EXTRACT)
handle = self._open(archive)
found, buf = False, []
def _callback(msg, UserData, P1, P2):
if msg == constants.UCM_PROCESSDATA:
data = (ctypes.c_char*P2).from_address(P1).raw
buf.append(data)
return 1
c_callback = unrarlib.UNRARCALLBACK(_callback)
unrarlib.RARSetCallback(handle, c_callback, 1)
try:
rarinfo = self._read_header(handle)
while rarinfo is not None:
#print "checking rar archive %s against %s" % (rarinfo.filename, member)
if rarinfo.filename == member:
self._process_current(handle, constants.RAR_TEST)
found = True
else:
self._process_current(handle, constants.RAR_SKIP)
rarinfo = self._read_header(handle)
except unrarlib.UnrarException:
raise rarfile.BadRarFile("Bad RAR archive data.")
finally:
self._close(handle)
if not found:
raise KeyError('There is no item named %r in the archive' % member)
return ''.join(buf)
if platform.system() == "Windows":
import _subprocess
@ -40,8 +84,8 @@ except ImportError:
pil_available = False
sys.path.insert(0, os.path.abspath(".") )
import UnRAR2
from UnRAR2.rar_exceptions import *
#import UnRAR2
#from UnRAR2.rar_exceptions import *
#from settings import ComicTaggerSettings
from comicinfoxml import ComicInfoXml
@ -296,7 +340,7 @@ class RarArchiver:
# Make sure to escape brackets, since some funky stuff is going on
# underneath with "fnmatch"
archive_file = archive_file.replace("[", '[[]')
#archive_file = archive_file.replace("[", '[[]')
entries = []
rarc = self.getRARObj()
@ -305,11 +349,21 @@ class RarArchiver:
while tries < 7:
try:
tries = tries+1
entries = rarc.read_files( archive_file )
#tmp_folder = tempfile.mkdtemp()
#tmp_file = os.path.join(tmp_folder, archive_file)
#rarc.extract(archive_file, tmp_folder)
data = rarc.open(archive_file)
#data = open(tmp_file).read()
entries = [(rarc.getinfo(archive_file), data)]
if entries[0][0].size != len(entries[0][1]):
#shutil.rmtree(tmp_folder, ignore_errors=True)
#entries = rarc.read_files( archive_file )
if entries[0][0].file_size != len(entries[0][1]):
print >> sys.stderr, u"readArchiveFile(): [file is not expected size: {0} vs {1}] {2}:{3} [attempt # {4}]".format(
entries[0][0].size,len(entries[0][1]), self.path, archive_file, tries)
entries[0][0].file_size,len(entries[0][1]), self.path, archive_file, tries)
continue
except (OSError, IOError) as e:
@ -395,7 +449,7 @@ class RarArchiver:
#namelist = [ item.filename for item in rarc.infolist() ]
namelist = []
for item in rarc.infolist():
if item.size != 0:
if item.file_size != 0:
namelist.append( item.filename )
except (OSError, IOError) as e:
@ -414,7 +468,8 @@ class RarArchiver:
while tries < 7:
try:
tries = tries+1
rarc = UnRAR2.RarFile( self.path )
#rarc = UnRAR2.RarFile( self.path )
rarc = OpenableRarFile(self.path)
except (OSError, IOError) as e:
print >> sys.stderr, u"getRARObj(): [{0}] {1} attempt#{2}".format(str(e), self.path, tries)
@ -604,7 +659,7 @@ class ComicArchive:
def rarTest( self ):
try:
rarc = UnRAR2.RarFile( self.path )
rarc = rarfile.RarFile( self.path )
except: # InvalidRARArchive:
return False
else: