Ejemplo n.º 1
0
    def save_file(self, datafile):
        """
        Ouvrir le fichier uploadé et créer les images contenues

        :param datafile: nom du fichier d'archive ou handle de fichier
        """
        if isinstance(datafile, str):
            datafile = open(datafile, 'r')
        content_type = datafile.content_type
        if content_type in {
                'application/zip', 'application/x-zip-compressed',
                'application/x-rar-compressed'
        }:
            if content_type in {'application/x-rar-compressed'}:
                archive = RarFile(datafile, 'r')
            else:
                archive = ZipFile(datafile, 'r')
            names = archive.namelist()
            for name in names:
                filename, fileext = os.path.splitext(name.lower())
                if fileext in ('.png', '.jpg', '.jpeg'):
                    item = archive.open(name)
                    with NamedTemporaryFile(prefix=slugify(filename),
                                            suffix=fileext,
                                            delete=False) as tfile:
                        tfile.write(item.read())
                        picture = Picture(author=self.request.user)
                        picture.image.save(tfile.name, File(tfile))
                        picture.save()
                    item.close()
            archive.close()
            datafile.close()
            return self.cleaned_data
        else:
            raise forms.ValidationError(_("File must be a zip or rar file"))
Ejemplo n.º 2
0
class RarFileExtractor(Extractor):
    def __init__(self, archive_path: str):
        self.archive_path = archive_path
        self.rarfile = RarFile(self.archive_path)
        self.namelist = {
            i.filename
            for i in self.rarfile.infolist() if not i.isdir()
        }

    def __exit__(self, *args):
        self.rarfile.close()

    def list_files(self) -> {}:
        return self.namelist

    def extract(self,
                file_name: str,
                dest_path: str,
                write_hook: Callable[[bytes], bytes] = None):
        with self.rarfile.open(file_name) as rf, open(dest_path, 'wb') as out:
            while True:
                chunk = rf.read(CHUNKSIZE)
                if not chunk:
                    break
                out.write(write_hook(chunk) if write_hook else chunk)
Ejemplo n.º 3
0
 def __extract_cbr(self, file):
     """ extract first image in cbr file, cache it in local cache folder"""
     try:
         archive_rar = RarFile(file, 'r')
         extract_path = self.cache + path.basename(file)
         if self.mode is 'all':
             archive_rar.extractall(path=extract_path)
         else:
             first_file = archive_rar.namelist()[0]
             archive_rar.extract(member=first_file, path=extract_path)
     except BadRarFile as e:
         raise e
     finally:
         archive_rar.close()
     return extract_path
Ejemplo n.º 4
0
class RarArchive(BaseArchive):

    def __init__(self, file):
        self._archive = RarFile(file)

    def namelist(self):
        return self._archive.namelist()

    def filenames(self):
        return self._archive.namelist()

    def close(self):
        return self._archive.close()

    def is_encrypted(self):
        return self._archive.needs_password()

    def extraxt(self):
        rarfile = rarfile.RarFile.self._archive
        rarfile.extraxt(self._archive._rarfile)

    def extractall(self, file):
        return self._archive.extractall(file)

    def list(self, *args, **kwargs):
        self.printdir(*args, **kwargs)

    def printdir(self, file=None):
        """Print a table of contents for the zip file."""
        print("%-46s %19s %12s" % ("File Name", "Modified    ", "Size"),
              file=file)
        for file_ in self._archive._file_parser.infolist():
            date = "%d-%02d-%02d %02d:%02d:%02d" % file_.date_time[:6]
            print("%-46s %s %12d" % (file_.filename, date, file_.file_size),
                  file=file)
 def extract_rar(self,tarfile_fullpath, delete_tar_file=DELETE,Path=True):
     tarfile_name = os.path.basename(tarfile_fullpath)
     parent_dir = os.path.dirname(tarfile_fullpath)
     extract_folder_name = tarfile_name[:-1*len(self.fileExtension(tarfile_name))-1]
     if Path:
         if self.extract_path:
             extract_folder_fullpath = os.path.join(self.extract_path, extract_folder_name)
         else:
             extract_folder_fullpath = os.path.join(parent_dir,"archivedFiles", extract_folder_name)
     else:
         extract_folder_fullpath = os.path.join(parent_dir, extract_folder_name)
     
     try:
         rar = RarFile(tarfile_fullpath, "r")
         rar.extractall(extract_folder_fullpath)
         rar.close()
         if delete_tar_file:
             os.remove(tarfile_fullpath)
         return extract_folder_fullpath
     except Exception as e:
         # Exceptions can occur while opening a damaged tar file.
         print 'Error occured while extracting %s\n'\
         'Reason: %s' %(tarfile_fullpath, e)
         return
Ejemplo n.º 6
0
def unrar( filename, destination=None, report=False ):
    from rarfile import RarFile
    base_dir = ""
    if destination is None:
        destination = os.path.dirname( filename )
    try:
        rar = RarFile( filename, "r" )
        namelist = rar.namelist()
        total_items = len( namelist ) or 1
        diff = 100.0 / total_items
        percent = 0
        # nom du dossier racine
        root_dir = namelist[ -1 ]
        is_root_dir = True
        # si root_dir n'est pas un dossier ou n'est pas la racine, on se base sur le nom de l'archive
        #print root_dir
        if not rar.getinfo( root_dir ).isdir():
            is_root_dir = False
        else:
            for i in namelist:
                #print root_dir in i, i
                if not root_dir in i:
                    is_root_dir = False
                    break
        if not is_root_dir:#rar.getinfo( root_dir ).isdir():
            root_dir = os.path.basename( os.path.splitext( filename )[ 0 ] )
        base_dir = os.path.join( destination, root_dir )
        if os.path.isdir( base_dir ):
            shutil2.rmtree( base_dir )
        os.makedirs( base_dir )
        time_sleep = get_time_sleep( filename )
        # avec cette methode on extract dans le dossier ou est l'archive
        ok = executebuiltin( 'XBMC.Extract(%s)' % ( filename, ) )
        #sleep une seconde ou plus selon la drosseur du fichier le temps que le builtin est fini car l'action suivante
        # "os.listdir" est excecuter avant la fin du builtin
        sleep( time_sleep )
        # si le dossier base_dir est vide on move les items de namelist dedans
        if not os.listdir( base_dir ):
            for item in namelist:
                src = os.path.normpath( os.path.join( os.path.dirname( filename ), item ) )
                dst = os.path.normpath( os.path.join( base_dir, item ) )
                if not rar.getinfo( item ).isdir():
                    if not os.path.isdir( os.path.dirname( dst ) ):
                        os.makedirs( os.path.dirname( dst ) )
                    shutil2.move( src, dst, overwrite=True )
                elif os.path.exists( src ) and not os.listdir( src ):
                    shutil2.rmtree( src )
        #maintenant on verifier l'extraction d'xbmc avec la liste de la lib rarfile
        if os.path.isdir( base_dir ):
            size = 0
            list_size = 0
            if not root_dir in namelist:
                list_size -= 1
            namelist = [ os.path.split( item )[ 1 ] for item in namelist ]
            for root, dirs, files in os.walk( base_dir, topdown=False ):
                percent += diff
                list_size += 1
                for file in files:
                    percent += diff
                    list_size += 1
                    if report:
                        if DIALOG_PROGRESS.iscanceled():
                            break
                        DIALOG_PROGRESS.update( int( percent ), Language( 187 ) % ( list_size, total_items ), file, Language( 110 ) )
                        #print round( percent, 2 ), file
                    if file in namelist:
                        size += os.path.getsize( os.path.join( root, file ) )
                    else:
                        print "Error %s est dans la liste de depart!" % file
            #print size
            if not size:
                print "Error for extracting rar: %s" % filename
        rar.close()
        del rar
        # si list_size est pas declarer une erreur automatique est creer ;)
        return base_dir, list_size == total_items
    except:
        print_exc()
    return "", False
Ejemplo n.º 7
0
def unrar(filename, destination=None, report=False):
    from rarfile import RarFile
    base_dir = ""
    if destination is None:
        destination = os.path.dirname(filename)
    try:
        rar = RarFile(filename, "r")
        namelist = rar.namelist()
        total_items = len(namelist) or 1
        diff = 100.0 / total_items
        percent = 0
        # nom du dossier racine
        root_dir = namelist[-1]
        is_root_dir = True
        # si root_dir n'est pas un dossier ou n'est pas la racine, on se base sur le nom de l'archive
        if not rar.getinfo(root_dir).isdir():
            is_root_dir = False
        else:
            for i in namelist:
                #print root_dir in i, i
                if not root_dir in i:
                    is_root_dir = False
                    break
        if not is_root_dir:  #rar.getinfo( root_dir ).isdir():
            root_dir = os.path.basename(os.path.splitext(filename)[0])
        base_dir = os.path.join(destination, root_dir)
        if os.path.isdir(base_dir):
            shutil2.rmtree(base_dir)
        os.makedirs(base_dir)
        time_sleep = get_time_sleep(filename)
        # avec cette methode on extract dans le dossier ou est l'archive
        ok = executebuiltin('XBMC.Extract(%s)' % (filename, ))
        #sleep une seconde ou plus selon la drosseur du fichier le temps que le builtin est fini car l'action suivante
        # "os.listdir" est excecuter avant la fin du builtin
        sleep(time_sleep)
        # si le dossier base_dir est vide on move les items de namelist dedans
        if not os.listdir(base_dir):
            for item in namelist:
                src = os.path.normpath(
                    os.path.join(os.path.dirname(filename), item))
                dst = os.path.normpath(os.path.join(base_dir, item))
                if not rar.getinfo(item).isdir():
                    if not os.path.isdir(os.path.dirname(dst)):
                        os.makedirs(os.path.dirname(dst))
                    shutil2.move(src, dst, overwrite=True)
                elif os.path.exists(src) and not os.listdir(src):
                    shutil2.rmtree(src)
        #maintenant on verifier l'extraction d'xbmc avec la liste de la lib rarfile
        if os.path.isdir(base_dir):
            size = 0
            list_size = 0
            if not root_dir in namelist:
                list_size -= 1
            namelist = [os.path.split(item)[1] for item in namelist]
            for root, dirs, files in os.walk(base_dir, topdown=False):
                percent += diff
                list_size += 1
                for file in files:
                    percent += diff
                    list_size += 1
                    if report:
                        if DIALOG_PROGRESS.iscanceled():
                            break
                        DIALOG_PROGRESS.update(
                            int(percent),
                            _(30187) % (list_size, total_items), file,
                            _(30110))
                        #print round( percent, 2 ), file
                    if file in namelist:
                        size += os.path.getsize(os.path.join(root, file))
                    else:
                        print "Error %s est dans la liste de depart!" % file
            #print size
            if not size:
                print "Error for extracting rar: %s" % filename
        rar.close()
        del rar
        # si list_size est pas declarer une erreur automatique est creer ;)
        return base_dir, list_size == total_items
    except:
        print_exc()
    return "", False
Ejemplo n.º 8
0
def downloader(code, key):
    newDir()
    error = exist = 0
    isError = isExist = ''
    nameList = listdir('PPT')
    extensions = []
    print('读取成功!开始下载')
    pools = Semaphore(4)
    threads = []

    def down(e):
        with pools:
            downFilename = key + code[e]
            if judgeFile(downFilename, nameList) == -1: return 0
            try:
                downloadUrl = processor(code[e])
                extensions.append(downloadUrl[len(downloadUrl) -
                                              4:len(downloadUrl)])
                with open('temp\\{}.temp'.format(downFilename), 'wb') as f:
                    f.write(_get(downloadUrl, verify=False).content)
            except:
                pass

    for each in range(len(code)):
        threads.append(Thread(target=down, args=(each, )))
    for each in threads:
        each.start()
    for each in range(len(threads)):
        showBar(each + 1, len(code) + 1)
        threads[each].join()
    print('\n下载完毕!正在解压')
    for each in range(len(code)):
        showBar(each + 1, len(code) + 1)
        filename = key + code[each]
        judgeCode = judgeFile(filename, nameList, False)
        if judgeCode == -1:
            exist = exist + 1
            continue
        extension = extensions[each]
        try:
            move('temp\\{}.temp'.format(filename),
                 'PPT\\{}{}'.format(filename, extension))
            if extension == '.rar':
                package = RarFile('PPT\\{}.rar'.format(filename))
            elif extension == '.zip':
                package = ZipFile('PPT\\{}.zip'.format(filename))
            else:
                print('\r{}{}解压失败,格式不支持。{}'.format(filename, extension,
                                                   ' ' * 5))
                error = error + 1
                continue
            name = package.namelist()[0]
            package.extractall('PPT')
            package.close()
            try:
                rename('PPT\\{}'.format(name),
                       'PPT\\{}{}'.format(filename, name))
            except:
                pass
        except:
            print('\r{}{}解压失败,找不到文件。{}'.format(filename, extension, ' ' * 5))
            error = error + 1
    print('\n下载成功!处理文件中。。。')
    for each in listdir('PPT'):
        if path.splitext(each)[1] != '.ppt' and path.splitext(
                each)[1] != '.pptx' and not path.isdir('PPT\\' + each):
            remove('PPT\\' + each)
    if error > 0: isError = ',{}个错误'.format(error)
    if exist > 0: isExist = ',{}个文件已存在。'.format(exist)
    print('PPT下载成功,共{}个{}{}'.format(len(code), isError, isExist))
    while True:
        pass