Loading opds_catalog/dl.py +20 −12 Original line number Diff line number Diff line Loading @@ -39,37 +39,45 @@ def getFileData(book): z = None fz = None s = None fo = None #print("************ ТИП КНИГИ: %s"%book.cat_type) if book.cat_type==opdsdb.CAT_NORMAL: file_path=os.path.join(full_path, book.filename) try: #print("************ ПУТЬ К КНИГЕ: %s" % file_path) fo=codecs.open(file_path, "rb") s = fo.read() #s = fo.read() except FileNotFoundError: s = None #s = None fo = None elif book.cat_type in [opdsdb.CAT_ZIP, opdsdb.CAT_INP]: try: fz=codecs.open(full_path, "rb") z = zipfile.ZipFile(fz, 'r', allowZip64=True) fo= z.open(book.filename) s=fo.read() #s=fo.read() except FileNotFoundError: s = None #s = None fo = None fo.close() if z: z.close() if fz: fz.close() #if fo: fo.close() #if z: z.close() #if fz: fz.close() return s return fo def getFileDataZip(s,transname): def getFileDataZip(fo,transname): dio = io.BytesIO() zo = zipfile.ZipFile(dio, 'w', zipfile.ZIP_DEFLATED) zo.writestr(transname, s) zo.writestr(transname, fo.read()) zo.close() buf = dio.getvalue() dio.seek(0) #buf = dio.getvalue() return buf return dio def Download(request, book_id, zip_flag): """ Загрузка файла книги """ Loading opds_catalog/management/commands/sopds_telebot.py +30 −31 Original line number Diff line number Diff line Loading @@ -11,8 +11,8 @@ from django.urls import reverse from opds_catalog.models import Book, Author from opds_catalog import settings, dl from constance import config from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, RegexHandler from telegram import InlineKeyboardButton, InlineKeyboardMarkup from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, RegexHandler, CallbackQueryHandler from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Document class Command(BaseCommand): help = 'SimpleOPDS Telegram Bot engine.' Loading Loading @@ -111,7 +111,7 @@ class Command(BaseCommand): authors = ', '.join([a['full_name'] for a in book.authors.values()]) response = '<b>%(title)s</b>\n%(author)s\n<b>Аннотация:</b>%(annotation)s\n' % {'title': book.title, 'author': authors, 'annotation':book.annotation} buttons = [InlineKeyboardButton(book.format.upper(), callback_data='/getfile%s'%book_id)] buttons = [InlineKeyboardButton(book.format.upper(), callback_data='/getfileorig%s'%book_id)] # url=config.SOPDS_SITE_ROOT+reverse("opds_catalog:download", kwargs={"book_id": book.id, "zip_flag": 0}))] if not book.format in settings.NOZIP_FORMATS: buttons += [InlineKeyboardButton(book.format.upper()+'.ZIP', callback_data='/getfilezip%s'%book_id)] Loading @@ -127,8 +127,9 @@ class Command(BaseCommand): bot.sendMessage(chat_id=update.message.chat_id, text=response, parse_mode='HTML', reply_markup=markup) self.logger.info("Send download buttons.") def getBookFile(self, bot, update): book_id_set=re.findall(r'\d+$',update.message.text) def getBookFile(self, bot, update, user_data): query = update.callback_query book_id_set=re.findall(r'\d+$',query.data) if len(book_id_set)==1: try: book_id=int(book_id_set[0]) Loading @@ -141,35 +142,35 @@ class Command(BaseCommand): if book==None: response = 'Книга по указанной Вами ссылке не найдена, попробуйте повторить поиск книги сначала.' bot.sendMessage(chat_id=update.message.chat_id, text=response, parse_mode='HTML') bot.sendMessage(chat_id=query.message.chat_id, text=response, parse_mode='HTML') self.logger.info("Not find download links: %s" % response) return filename = dl.getFileName(book) bot.send_document(chat_id=update.message.chat_id, document=dl.getFileData(book),filename=filename) self.logger.info("Send file: %s" % filename) document = None def getBookFileZip(self, bot, update): book_id_set=re.findall(r'\d+$',update.message.text) if len(book_id_set)==1: try: book_id=int(book_id_set[0]) book=Book.objects.get(id=book_id) except: book=None else: book_id=None book=None if re.match(r'/getfileorig',query.data): document = dl.getFileData(book) #document = config.SOPDS_SITE_ROOT + reverse("opds_catalog:download",kwargs={"book_id": book.id, "zip_flag": 0}) if book==None: response = 'Книга по указанной Вами ссылке не найдена, попробуйте повторить поиск книги сначала.' bot.sendMessage(chat_id=update.message.chat_id, text=response, parse_mode='HTML') self.logger.info("Not find download links: %s" % response) if re.match(r'/getfilezip',query.data): document = dl.getFileDataZip(dl.getFileData(book), filename) #document = config.SOPDS_SITE_ROOT + reverse("opds_catalog:download", kwargs={"book_id": book.id, "zip_flag": 1}) filename = filename + '.zip' if document: bot.send_document(chat_id=query.message.chat_id,document=document,filename=filename) self.logger.info("Send file: %s" % filename) else: response = 'Возникла техническая ошибка, обратитесь к администратору сайта.' bot.sendMessage(chat_id=query.message.chat_id, text=response, parse_mode='HTML') self.logger.info("Book get error: %s" % response) return filename=dl.getFileName(book) bot.send_document(chat_id=update.message.chat_id, document=dl.getFileDataZip(dl.getFileData(book),filename),filename=filename+'.zip') self.logger.info("Send file: %s" % (filename+'.zip')) user_data['type'] = query.data; return def start(self): writepid(self.pidfile) Loading @@ -181,14 +182,12 @@ class Command(BaseCommand): start_command_handler = CommandHandler('start', self.startCommand) getBook_handler = MessageHandler(Filters.text, self.getBooks) download_handler = RegexHandler('^/download\d+$',self.downloadBooks) sendfile_handler = RegexHandler('^/getfile\d+$', self.getBookFile) sendfilezip_handler = RegexHandler('^/getfilezip\d+$', self.getBookFileZip) updater.dispatcher.add_handler(start_command_handler) updater.dispatcher.add_handler(getBook_handler) updater.dispatcher.add_handler(download_handler) updater.dispatcher.add_handler(sendfile_handler) updater.dispatcher.add_handler(sendfilezip_handler) updater.dispatcher.add_handler(CallbackQueryHandler(self.getBookFile, pass_user_data=True)) updater.start_polling(clean=True) updater.idle() except (KeyboardInterrupt, SystemExit): Loading sopds/settings.py +1 −2 Original line number Diff line number Diff line Loading @@ -175,7 +175,6 @@ CONSTANCE_CONFIG = OrderedDict([ ('SOPDS_CACHE_TIME', (1200, _('Pages cache time'))), ('SOPDS_TELEBOT_API_TOKEN', ('', _('Telegramm API Token'))), ('SOPDS_SITE_ROOT', ('http://you_domain:8001/', _('Root URL for your SOPDS Site'))), ('SOPDS_AUTH', (True,_('Enable authentication'))), ('SOPDS_ALPHABET_MENU', (True,_('Enable alphabet submenu'))), Loading Loading @@ -219,7 +218,7 @@ CONSTANCE_CONFIG_FIELDSETS = { '2. Server Options': ('SOPDS_AUTH', 'SOPDS_ALPHABET_MENU', 'SOPDS_DOUBLES_HIDE', 'SOPDS_COVER_SHOW', 'SOPDS_SPLITITEMS', 'SOPDS_MAXITEMS', 'SOPDS_TITLE_AS_FILENAME', 'SOPDS_NOCOVER_PATH'), '3. Scanner Options': ('SOPDS_FB2SAX','SOPDS_ZIPSCAN','SOPDS_ZIPCODEPAGE', 'SOPDS_INPX_ENABLE', 'SOPDS_INPX_SKIP_UNCHANGED', 'SOPDS_INPX_TEST_ZIP', 'SOPDS_INPX_TEST_FILES', 'SOPDS_DELETE_LOGICAL'), '4. Scanner Shedule': ('SOPDS_SCAN_SHED_MIN', 'SOPDS_SCAN_SHED_HOUR', 'SOPDS_SCAN_SHED_DAY','SOPDS_SCAN_SHED_DOW'), '5. Telegramm Bot Options': ('SOPDS_TELEBOT_API_TOKEN','SOPDS_SITE_ROOT'), '5. Telegramm Bot Options': ('SOPDS_TELEBOT_API_TOKEN'), '6. Converters Options': ('SOPDS_FB2TOEPUB', 'SOPDS_FB2TOMOBI', 'SOPDS_TEMP_DIR'), '7. Log & PID Files': ('SOPDS_SERVER_LOG', 'SOPDS_SCANNER_LOG', 'SOPDS_TELEBOT_LOG','SOPDS_SERVER_PID','SOPDS_SCANNER_PID','SOPDS_TELEBOT_PID'), } Loading Loading
opds_catalog/dl.py +20 −12 Original line number Diff line number Diff line Loading @@ -39,37 +39,45 @@ def getFileData(book): z = None fz = None s = None fo = None #print("************ ТИП КНИГИ: %s"%book.cat_type) if book.cat_type==opdsdb.CAT_NORMAL: file_path=os.path.join(full_path, book.filename) try: #print("************ ПУТЬ К КНИГЕ: %s" % file_path) fo=codecs.open(file_path, "rb") s = fo.read() #s = fo.read() except FileNotFoundError: s = None #s = None fo = None elif book.cat_type in [opdsdb.CAT_ZIP, opdsdb.CAT_INP]: try: fz=codecs.open(full_path, "rb") z = zipfile.ZipFile(fz, 'r', allowZip64=True) fo= z.open(book.filename) s=fo.read() #s=fo.read() except FileNotFoundError: s = None #s = None fo = None fo.close() if z: z.close() if fz: fz.close() #if fo: fo.close() #if z: z.close() #if fz: fz.close() return s return fo def getFileDataZip(s,transname): def getFileDataZip(fo,transname): dio = io.BytesIO() zo = zipfile.ZipFile(dio, 'w', zipfile.ZIP_DEFLATED) zo.writestr(transname, s) zo.writestr(transname, fo.read()) zo.close() buf = dio.getvalue() dio.seek(0) #buf = dio.getvalue() return buf return dio def Download(request, book_id, zip_flag): """ Загрузка файла книги """ Loading
opds_catalog/management/commands/sopds_telebot.py +30 −31 Original line number Diff line number Diff line Loading @@ -11,8 +11,8 @@ from django.urls import reverse from opds_catalog.models import Book, Author from opds_catalog import settings, dl from constance import config from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, RegexHandler from telegram import InlineKeyboardButton, InlineKeyboardMarkup from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, RegexHandler, CallbackQueryHandler from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Document class Command(BaseCommand): help = 'SimpleOPDS Telegram Bot engine.' Loading Loading @@ -111,7 +111,7 @@ class Command(BaseCommand): authors = ', '.join([a['full_name'] for a in book.authors.values()]) response = '<b>%(title)s</b>\n%(author)s\n<b>Аннотация:</b>%(annotation)s\n' % {'title': book.title, 'author': authors, 'annotation':book.annotation} buttons = [InlineKeyboardButton(book.format.upper(), callback_data='/getfile%s'%book_id)] buttons = [InlineKeyboardButton(book.format.upper(), callback_data='/getfileorig%s'%book_id)] # url=config.SOPDS_SITE_ROOT+reverse("opds_catalog:download", kwargs={"book_id": book.id, "zip_flag": 0}))] if not book.format in settings.NOZIP_FORMATS: buttons += [InlineKeyboardButton(book.format.upper()+'.ZIP', callback_data='/getfilezip%s'%book_id)] Loading @@ -127,8 +127,9 @@ class Command(BaseCommand): bot.sendMessage(chat_id=update.message.chat_id, text=response, parse_mode='HTML', reply_markup=markup) self.logger.info("Send download buttons.") def getBookFile(self, bot, update): book_id_set=re.findall(r'\d+$',update.message.text) def getBookFile(self, bot, update, user_data): query = update.callback_query book_id_set=re.findall(r'\d+$',query.data) if len(book_id_set)==1: try: book_id=int(book_id_set[0]) Loading @@ -141,35 +142,35 @@ class Command(BaseCommand): if book==None: response = 'Книга по указанной Вами ссылке не найдена, попробуйте повторить поиск книги сначала.' bot.sendMessage(chat_id=update.message.chat_id, text=response, parse_mode='HTML') bot.sendMessage(chat_id=query.message.chat_id, text=response, parse_mode='HTML') self.logger.info("Not find download links: %s" % response) return filename = dl.getFileName(book) bot.send_document(chat_id=update.message.chat_id, document=dl.getFileData(book),filename=filename) self.logger.info("Send file: %s" % filename) document = None def getBookFileZip(self, bot, update): book_id_set=re.findall(r'\d+$',update.message.text) if len(book_id_set)==1: try: book_id=int(book_id_set[0]) book=Book.objects.get(id=book_id) except: book=None else: book_id=None book=None if re.match(r'/getfileorig',query.data): document = dl.getFileData(book) #document = config.SOPDS_SITE_ROOT + reverse("opds_catalog:download",kwargs={"book_id": book.id, "zip_flag": 0}) if book==None: response = 'Книга по указанной Вами ссылке не найдена, попробуйте повторить поиск книги сначала.' bot.sendMessage(chat_id=update.message.chat_id, text=response, parse_mode='HTML') self.logger.info("Not find download links: %s" % response) if re.match(r'/getfilezip',query.data): document = dl.getFileDataZip(dl.getFileData(book), filename) #document = config.SOPDS_SITE_ROOT + reverse("opds_catalog:download", kwargs={"book_id": book.id, "zip_flag": 1}) filename = filename + '.zip' if document: bot.send_document(chat_id=query.message.chat_id,document=document,filename=filename) self.logger.info("Send file: %s" % filename) else: response = 'Возникла техническая ошибка, обратитесь к администратору сайта.' bot.sendMessage(chat_id=query.message.chat_id, text=response, parse_mode='HTML') self.logger.info("Book get error: %s" % response) return filename=dl.getFileName(book) bot.send_document(chat_id=update.message.chat_id, document=dl.getFileDataZip(dl.getFileData(book),filename),filename=filename+'.zip') self.logger.info("Send file: %s" % (filename+'.zip')) user_data['type'] = query.data; return def start(self): writepid(self.pidfile) Loading @@ -181,14 +182,12 @@ class Command(BaseCommand): start_command_handler = CommandHandler('start', self.startCommand) getBook_handler = MessageHandler(Filters.text, self.getBooks) download_handler = RegexHandler('^/download\d+$',self.downloadBooks) sendfile_handler = RegexHandler('^/getfile\d+$', self.getBookFile) sendfilezip_handler = RegexHandler('^/getfilezip\d+$', self.getBookFileZip) updater.dispatcher.add_handler(start_command_handler) updater.dispatcher.add_handler(getBook_handler) updater.dispatcher.add_handler(download_handler) updater.dispatcher.add_handler(sendfile_handler) updater.dispatcher.add_handler(sendfilezip_handler) updater.dispatcher.add_handler(CallbackQueryHandler(self.getBookFile, pass_user_data=True)) updater.start_polling(clean=True) updater.idle() except (KeyboardInterrupt, SystemExit): Loading
sopds/settings.py +1 −2 Original line number Diff line number Diff line Loading @@ -175,7 +175,6 @@ CONSTANCE_CONFIG = OrderedDict([ ('SOPDS_CACHE_TIME', (1200, _('Pages cache time'))), ('SOPDS_TELEBOT_API_TOKEN', ('', _('Telegramm API Token'))), ('SOPDS_SITE_ROOT', ('http://you_domain:8001/', _('Root URL for your SOPDS Site'))), ('SOPDS_AUTH', (True,_('Enable authentication'))), ('SOPDS_ALPHABET_MENU', (True,_('Enable alphabet submenu'))), Loading Loading @@ -219,7 +218,7 @@ CONSTANCE_CONFIG_FIELDSETS = { '2. Server Options': ('SOPDS_AUTH', 'SOPDS_ALPHABET_MENU', 'SOPDS_DOUBLES_HIDE', 'SOPDS_COVER_SHOW', 'SOPDS_SPLITITEMS', 'SOPDS_MAXITEMS', 'SOPDS_TITLE_AS_FILENAME', 'SOPDS_NOCOVER_PATH'), '3. Scanner Options': ('SOPDS_FB2SAX','SOPDS_ZIPSCAN','SOPDS_ZIPCODEPAGE', 'SOPDS_INPX_ENABLE', 'SOPDS_INPX_SKIP_UNCHANGED', 'SOPDS_INPX_TEST_ZIP', 'SOPDS_INPX_TEST_FILES', 'SOPDS_DELETE_LOGICAL'), '4. Scanner Shedule': ('SOPDS_SCAN_SHED_MIN', 'SOPDS_SCAN_SHED_HOUR', 'SOPDS_SCAN_SHED_DAY','SOPDS_SCAN_SHED_DOW'), '5. Telegramm Bot Options': ('SOPDS_TELEBOT_API_TOKEN','SOPDS_SITE_ROOT'), '5. Telegramm Bot Options': ('SOPDS_TELEBOT_API_TOKEN'), '6. Converters Options': ('SOPDS_FB2TOEPUB', 'SOPDS_FB2TOMOBI', 'SOPDS_TEMP_DIR'), '7. Log & PID Files': ('SOPDS_SERVER_LOG', 'SOPDS_SCANNER_LOG', 'SOPDS_TELEBOT_LOG','SOPDS_SERVER_PID','SOPDS_SCANNER_PID','SOPDS_TELEBOT_PID'), } Loading