Commit ec6cb02e authored by Dmitry Shelepnev's avatar Dmitry Shelepnev
Browse files

Update inpx_parser an sopdscan modules: parse structure.info (and FOLDER field) in INP

parent c0892181
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
#### SimpleOPDS Catalog
#### Author: Dmitry V.Shelepnev
#### Version 0.46
#### Version 0.47-devel

[Инструкция на русском языке: README_RUS.md](README_RUS.md)

+1 −1
Original line number Diff line number Diff line
#### SimpleOPDS Catalog - Простой OPDS Каталог
#### Author: Dmitry V.Shelepnev  
#### Версия 0.46
#### Версия 0.47-devel

[English README.md](README.md)

+23 −18
Original line number Diff line number Diff line
@@ -31,9 +31,10 @@ def getFileName(book):
def getFileData(book):
    full_path = os.path.join(config.SOPDS_ROOT_LIB, book.path)
    if book.cat_type==opdsdb.CAT_INP:
        # Убираем из пути INPX файл
        inpx_path, zip_name = os.path.split(full_path)
        path, inpx_file = os.path.split(inpx_path)
        # Убираем из пути INPX и INP файл
        inp_path, zip_name = os.path.split(full_path)
        inpx_path, inp_name = os.path.split(inp_path)
        path, inpx_name = os.path.split(inpx_path)
        full_path = os.path.join(path,zip_name)

    z = None
@@ -148,9 +149,10 @@ def Download(request, book_id, zip_flag):
    full_path=os.path.join(config.SOPDS_ROOT_LIB,book.path)
    
    if book.cat_type==opdsdb.CAT_INP:
        # Убираем из пути INPX файл
        inpx_path, zip_name = os.path.split(full_path)
        path, inpx_file = os.path.split(inpx_path)
        # Убираем из пути INPX и INP файл
        inp_path, zip_name = os.path.split(full_path)
        inpx_path, inp_name = os.path.split(inp_path)
        path, inpx_name = os.path.split(inpx_path)
        full_path = os.path.join(path,zip_name)
        
    if config.SOPDS_TITLE_AS_FILENAME:
@@ -220,9 +222,10 @@ def Cover(request, book_id, thumbnail=False):
    response = HttpResponse()
    full_path = os.path.join(config.SOPDS_ROOT_LIB, book.path)
    if book.cat_type == opdsdb.CAT_INP:
        # Убираем из пути INPX файл
        inpx_path, zip_name = os.path.split(full_path)
        path, inpx_file = os.path.split(inpx_path)
        # Убираем из пути INPX и INP файл
        inp_path, zip_name = os.path.split(full_path)
        inpx_path, inp_name = os.path.split(inp_path)
        path, inpx_name = os.path.split(inpx_path)
        full_path = os.path.join(path,zip_name)

    try:
@@ -276,9 +279,10 @@ def Cover0(request, book_id, thumbnail = False):
    c0=0
    full_path=os.path.join(config.SOPDS_ROOT_LIB,book.path)
    if book.cat_type==opdsdb.CAT_INP:
        # Убираем из пути INPX файл
        inpx_path, zip_name = os.path.split(full_path)
        path, inpx_file = os.path.split(inpx_path)
        # Убираем из пути INPX и INP файл
        inp_path, zip_name = os.path.split(full_path)
        inpx_path, inp_name = os.path.split(inp_path)
        path, inpx_name = os.path.split(inpx_path)
        full_path = os.path.join(path,zip_name)
         
    if book.format=='fb2':        
@@ -342,9 +346,10 @@ def ConvertFB2(request, book_id, convert_type):

    full_path=os.path.join(config.SOPDS_ROOT_LIB,book.path)
    if book.cat_type==opdsdb.CAT_INP:
        # Убираем из пути INPX файл
        inpx_path, zip_name = os.path.split(full_path)
        path, inpx_file = os.path.split(inpx_path)
        # Убираем из пути INPX и INP файл
        inp_path, zip_name = os.path.split(full_path)
        inpx_path, inp_name = os.path.split(inp_path)
        path, inpx_name = os.path.split(inpx_path)
        full_path = os.path.join(path,zip_name)
            
    if config.SOPDS_TITLE_AS_FILENAME:
+54 −31
Original line number Diff line number Diff line
@@ -22,12 +22,21 @@ sDel = 'DEL'
sExt    = 'EXT'
sDate   = 'DATE'
sLang   = 'LANG'
sInsNo  = 'INSNO'
sFolder = 'FOLDER'
sLibRate= 'LIBRATE'
sKeyWords='KEYWORDS'


class Inpx:
    def __init__(self, inpx_file, append_callback, inpskip_callback = lambda inpx,inp,size:0):
        self.inpx_file = inpx_file
        self.inpx_catalog = os.path.dirname(inpx_file)
        self.inpx_format = [sAuthor,sGenre,sTitle,sSeries,sSerNo,sFile,sSize,sLibId,sDel,sExt,sDate,sLang]
        self.inpx_structure = False
        self.inpx_folders = False
        self.inpx_format = []
        self.inpx_archive = False
        self.inpx_arch_fnames = []
        self.inpx_encoding = 'utf-8'
        self.inpx_separator = b'\x04'
        self.inpx_itemseparator = ':'
@@ -40,6 +49,23 @@ class Inpx:
    def parse(self):
        finpx = zipfile.ZipFile(self.inpx_file, "r")
        filelist = finpx.namelist()
        # здесь читаем формат файлов inp, если есть, если нет, то по умолчанию
        if 'structure.info' in filelist:
            self.inpx_structure = True
            fsds = finpx.open('structure.info')
            fsb = str(fsds.read(),'utf-8')
            self.inpx_format = fsb.split(';')
            fsds.close()
            self.inpx_folders = sFolder in self.inpx_format
        else:
            self.inpx_format = [sAuthor,sGenre,sTitle,sSeries,sSerNo,sFile,sSize,sLibId,sDel,sExt,sDate,sLang]

        # здесь читаем список архивов в коллекции, если указано явно
        # эту информацию надо как-то использовать, чтобы протестировать наличие zip
        #if 'archives.info' in filelist:
        #    self.inpx_archive = True
        #    self.inpx_arch_fnames = finpx.open('archives.info').readlines()

        for inp_file in filelist:
            (inp_name,inp_ext) = os.path.splitext(inp_file)
            
@@ -47,26 +73,19 @@ class Inpx:
            if inp_ext.upper() != '.INP':
                continue

            zip_file_name = os.path.join(self.inpx_catalog,"%s%s"%(inp_name,'.zip'))
            
            # Если решили проверять на наличие ZIP файла или книги в ZIP, а самого ZIP файла нет - то пропускаем обработку всего ZIP файла
            if (self.TEST_ZIP or self.TEST_FILES) and not os.path.isfile(zip_file_name):
                continue
                        
            if self.inpskip_callback(self.inpx_file, inp_name,finpx.getinfo(inp_file).file_size):
            # Пропускаем разбор INP файла, если его размер не изменился
            if self.inpskip_callback(self.inpx_file, inp_file, finpx.getinfo(inp_file).file_size):
                continue

            # Если будем проверять наличие файлов в ZIP то однократно получаем список файлов в обрабатываемом ZIP 
            if self.TEST_FILES: 
                testzip = zipfile.ZipFile(zip_file_name, "r")
                testzip_namelist = testzip.namelist()
            else:
                testzip_namelist = []
            
            finp = finpx.open(inp_file)
            for line in finp:
                meta_list = line.split(self.inpx_separator)
                meta_data = {}

                # Добавляем sFolder если он не определен
                if not self.inpx_folders:
                    meta_data[sFolder] = "%s%s" % (inp_name, '.zip')

                for idx, key in enumerate(self.inpx_format):
                    try:
                        if key in [sAuthor,sGenre,sSeries]:
@@ -82,9 +101,13 @@ class Inpx:
                if not (meta_data[sDel].strip() in ['','0']):
                    continue

                # Если решили проверять на наличие ZIP файла или книги в ZIP, а самого ZIP файла нет - то пропускаем вызов callback
                if (self.TEST_ZIP or self.TEST_FILES) and not os.path.isfile(meta_data[sFolder]):
                    continue

                # Если нужно выполнить проверку книги в ZIP, а ее там не оказалось, то пропускаем вызов callback
                if self.TEST_FILES:
                    if not "%s.%s"(meta_data[sFile],meta_data[sExt]) in testzip_namelist:
                    if not "%s.%s"(meta_data[sFile],meta_data[sExt]) in zipfile.ZipFile(meta_data[sFolder], "r").namelist():
                        continue

                self.append_callback(self.inpx_file, inp_name, meta_data)

opds_catalog/inpx_parser1.py

deleted100644 → 0
+0 −117
Original line number Diff line number Diff line
'''
Created on 14 нояб. 2016 г.

@author: Shelepnev, Dmitry
'''

# -*- coding: utf-8 -*-
import os
import zipfile
#from opds_catalog import settings
from constance import config

sAuthor = 'AUTHOR'
sGenre  = 'GENRE'
sTitle  = 'TITLE'
sSeries = 'SERIES'
sSerNo  = 'SERNO'
sFile   = 'FILE'
sSize   = 'SIZE'
sLibId  = 'LIBID'
sDel    = 'DEL'
sExt    = 'EXT'
sDate   = 'DATE'
sLang   = 'LANG'
sInsNo  = 'INSNO'
sFolder = 'FOLDER'
sLibRate= 'LIBRATE'
sKeyWords='KEYWORDS'


class Inpx:
    def __init__(self, inpx_file, append_callback, inpskip_callback = lambda inpx,inp,size:0):
        self.inpx_file = inpx_file
        self.inpx_catalog = os.path.dirname(inpx_file)
        self.inpx_structure = False
        self.inpx_format = []
        self.inpx_archive = False
        self.inpx_arch_fnames = []
        self.inpx_encoding = 'utf-8'
        self.inpx_separator = b'\x04'
        self.inpx_itemseparator = ':'
        self.append_callback = append_callback
        self.inpskip_callback = inpskip_callback
        self.TEST_ZIP = config.SOPDS_INPX_TEST_ZIP
        self.TEST_FILES = config.SOPDS_INPX_TEST_FILES
        self.error = 0       
        
    def parse(self):
        finpx = zipfile.ZipFile(self.inpx_file, "r")
        filelist = finpx.namelist()
        # здесь читаем формат файлов inp, если есть, если нет, то по умолчанию
        if 'structure.info' in filelist:
            self.inpx_structure = True
            fsds = finpx.open('structure.info')
            fsb = str(fsds.read(),'utf-8')
            self.inpx_format = fsb.split(';')
        else:
            self.inpx_format = [sAuthor,sGenre,sTitle,sSeries,sSerNo,sFile,sSize,sLibId,sDel,sExt,sDate,sLang]
        
        # здесь читаем список архивов в коллекции, если указано явно
        if 'archives.info' in filelist:
            self.inpx_archive = True
            self.inpx_arch_fnames = finpx.open('archives.info').readlines()
        # эту информацию надо как-то использовать, чтобы протестировать наличие zip
        
        for inp_file in filelist:
            (inp_name,inp_ext) = os.path.splitext(inp_file)
            
            # Если файл не INP то пропускаем
            if inp_ext.upper() != '.INP':
                continue
            
            zip_file_name = os.path.join(self.inpx_catalog,"%s%s"%(inp_name,'.zip'))

            # Если решили проверять на наличие ZIP файла или книги в ZIP, а самого ZIP файла нет - то пропускаем обработку всего ZIP файла
            if (self.TEST_ZIP or self.TEST_FILES) and not os.path.isfile(zip_file_name):
                continue

            if self.inpskip_callback(self.inpx_file, inp_name,finpx.getinfo(inp_file).file_size):
                continue             
            
            # Если будем проверять наличие файлов в ZIP то однократно получаем список файлов в обрабатываемом ZIP 
            if self.TEST_FILES: 
                testzip = zipfile.ZipFile(zip_file_name, "r")
                testzip_namelist = testzip.namelist()
            else:
                testzip_namelist = []
            
            finp = finpx.open(inp_file)
            for line in finp:
                meta_list = line.split(self.inpx_separator)
                meta_data = {}
                for idx, key in enumerate(self.inpx_format):
                    try:          
                        if key in [sAuthor,sGenre,sSeries]:
                            meta_data[key] = meta_list[idx].decode(self.inpx_encoding).split(self.inpx_itemseparator)
                            if '' in  meta_data[key]:
                                meta_data[key].remove('')
                        else: 
                            meta_data[key] = meta_list[idx].decode(self.inpx_encoding)
                    except IndexError:
                        meta_data[key] = '' 
                                  
                # Если книга помечена как удаленная в INP, то пропускаем вызов callback   
                if not (meta_data[sDel].strip() in ['','0']):
                    continue          
                
                # Если нужно выполнить проверку книги в ZIP, а ее там не оказалось, то пропускаем вызов callback            
                if self.TEST_FILES:      
                    if not "%s.%s"(meta_data[sFile],meta_data[sExt]) in testzip_namelist:
                        continue 
                            
                self.append_callback(self.inpx_file, inp_name, meta_data)
				    
            finp.close()
        finpx.close()
        
Loading