Loading README.md +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) Loading 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) Loading opds_catalog/dl.py +23 −18 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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: Loading Loading @@ -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: Loading Loading @@ -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': Loading Loading @@ -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: Loading opds_catalog/inpx_parser.py +54 −31 Original line number Diff line number Diff line Loading @@ -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 = ':' Loading @@ -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) Loading @@ -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]: Loading @@ -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) Loading opds_catalog/inpx_parser1.pydeleted 100644 → 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
README.md +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) Loading
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) Loading
opds_catalog/dl.py +23 −18 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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: Loading Loading @@ -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: Loading Loading @@ -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': Loading Loading @@ -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: Loading
opds_catalog/inpx_parser.py +54 −31 Original line number Diff line number Diff line Loading @@ -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 = ':' Loading @@ -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) Loading @@ -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]: Loading @@ -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) Loading
opds_catalog/inpx_parser1.pydeleted 100644 → 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()