Loading .travis.yml +0 −1 Original line number Diff line number Diff line Loading @@ -9,7 +9,6 @@ install: - travis_retry pip install -r requirements.txt script: - python manage.py migrate database - python manage.py test #branches: Loading opds_catalog/dl.py +15 −14 Original line number Diff line number Diff line Loading @@ -11,15 +11,16 @@ from django.http import HttpResponse, Http404 from opds_catalog.models import Book, bookshelf from opds_catalog import settings, utils, opdsdb, fb2parse import opds_catalog.zipf as zipfile from constance import config def Download(request, book_id, zip_flag): """ Загрузка файла книги """ book = Book.objects.get(id=book_id) if settings.AUTH and request.user.is_authenticated(): if config.SOPDS_AUTH and request.user.is_authenticated(): bookshelf.objects.get_or_create(user=request.user, book=book) full_path=os.path.join(settings.ROOT_LIB,book.path) full_path=os.path.join(config.SOPDS_ROOT_LIB,book.path) if book.cat_type==opdsdb.CAT_INP: # Убираем из пути INPX файл Loading @@ -27,7 +28,7 @@ def Download(request, book_id, zip_flag): path, inpx_file = os.path.split(inpx_path) full_path = os.path.join(path,zip_name) if settings.TITLE_AS_FILENAME: if config.SOPDS_TITLE_AS_FILENAME: transname=utils.translit(book.title+'.'+book.format) else: transname=utils.translit(book.filename) Loading Loading @@ -98,7 +99,7 @@ def Cover(request, book_id): book = Book.objects.get(id=book_id) response = HttpResponse() c0=0 full_path=os.path.join(settings.ROOT_LIB,book.path) 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) Loading Loading @@ -132,9 +133,9 @@ def Cover(request, book_id): c0=0 if c0==0: if os.path.exists(settings.NOCOVER_PATH): if os.path.exists(config.SOPDS_NOCOVER_PATH): response["Content-Type"]='image/jpeg' f=open(settings.NOCOVER_PATH,"rb") f=open(config.SOPDS_NOCOVER_PATH,"rb") response.write(f.read()) f.close() else: Loading @@ -149,17 +150,17 @@ def ConvertFB2(request, book_id, convert_type): if book.format!='fb2': raise Http404 if settings.AUTH and request.user.is_authenticated(): if config.SOPDS_AUTH and request.user.is_authenticated(): bookshelf.objects.get_or_create(user=request.user, book=book) full_path=os.path.join(settings.ROOT_LIB,book.path) 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) full_path = os.path.join(path,zip_name) if settings.TITLE_AS_FILENAME: if config.SOPDS_TITLE_AS_FILENAME: transname=utils.translit(book.title+'.'+book.format) else: transname=utils.translit(book.filename) Loading @@ -170,10 +171,10 @@ def ConvertFB2(request, book_id, convert_type): dlfilename="%s.%s"%(n,convert_type) if convert_type=='epub': converter_path=settings.FB2TOEPUB converter_path=config.SOPDS_FB2TOEPUB content_type='application/epub+zip' elif convert_type=='mobi': converter_path=settings.FB2TOMOBI converter_path=config.SOPDS_FB2TOMOBI content_type='application/x-mobipocket-ebook' else: content_type='application/octet-stream' Loading @@ -187,11 +188,11 @@ def ConvertFB2(request, book_id, convert_type): except FileNotFoundError: raise Http404 z = zipfile.ZipFile(fz, 'r', allowZip64=True) z.extract(book.filename,settings.TEMP_DIR) tmp_fb2_path=os.path.join(settings.TEMP_DIR,book.filename) z.extract(book.filename,config.SOPDS_TEMP_DIR) tmp_fb2_path=os.path.join(config.SOPDS_TEMP_DIR,book.filename) file_path=tmp_fb2_path tmp_conv_path=os.path.join(settings.TEMP_DIR,dlfilename) tmp_conv_path=os.path.join(config.SOPDS_TEMP_DIR,dlfilename) popen_args = ("\"%s\" \"%s\" \"%s\""%(converter_path,file_path,tmp_conv_path)) proc = subprocess.Popen(popen_args, shell=True, stdout=subprocess.PIPE) #proc = subprocess.Popen((converter_path.encode('utf8'),file_path.encode('utf8'),tmp_conv_path.encode('utf8')), shell=True, stdout=subprocess.PIPE) Loading opds_catalog/feeds.py +19 −17 Original line number Diff line number Diff line Loading @@ -15,11 +15,13 @@ from opds_catalog import settings from opds_catalog.opds_middleware import BasicAuthMiddleware from opds_catalog.opds_paginator import Paginator as OPDS_Paginator from constance import config class AuthFeed(Feed): request = None def __call__(self,request,*args,**kwargs): self.request = request if settings.AUTH: if config.SOPDS_AUTH: if request.user.is_authenticated(): return super().__call__(request,*args,**kwargs) Loading Loading @@ -159,16 +161,16 @@ class MainFeed(AuthFeed): mainitems = [ {"id":1, "title":_("By catalogs"), "link":"opds_catalog:catalogs", "descr": _("Catalogs: %(catalogs)s, books: %(books)s."),"counters":{"catalogs":Counter.objects.get_counter(models.counter_allcatalogs),"books":Counter.objects.get_counter(models.counter_allbooks)}}, {"id":2, "title":_("By authors"), "link":("opds_catalog:lang_authors" if settings.ALPHABET_MENU else "opds_catalog:nolang_authors"), {"id":2, "title":_("By authors"), "link":("opds_catalog:lang_authors" if config.SOPDS_ALPHABET_MENU else "opds_catalog:nolang_authors"), "descr": _("Authors: %(authors)s."),"counters":{"authors":Counter.objects.get_counter(models.counter_allauthors)}}, {"id":3, "title":_("By titles"), "link":("opds_catalog:lang_books" if settings.ALPHABET_MENU else "opds_catalog:nolang_books"), {"id":3, "title":_("By titles"), "link":("opds_catalog:lang_books" if config.SOPDS_ALPHABET_MENU else "opds_catalog:nolang_books"), "descr": _("Books: %(books)s."),"counters":{"books":Counter.objects.get_counter(models.counter_allbooks)}}, {"id":4, "title":_("By genres"), "link":"opds_catalog:genres", "descr": _("Genres: %(genres)s."),"counters":{"genres":Counter.objects.get_counter(models.counter_allgenres)}}, {"id":5, "title":_("By series"), "link":("opds_catalog:lang_series" if settings.ALPHABET_MENU else "opds_catalog:nolang_series"), {"id":5, "title":_("By series"), "link":("opds_catalog:lang_series" if config.SOPDS_ALPHABET_MENU else "opds_catalog:nolang_series"), "descr": _("Series: %(series)s."),"counters":{"series":Counter.objects.get_counter(models.counter_allseries)}}, ] if settings.AUTH and self.request.user.is_authenticated(): if config.SOPDS_AUTH and self.request.user.is_authenticated(): mainitems += [ {"id":6, "title":_("%(username)s Book shelf")%({"username":self.request.user.username}), "link":"opds_catalog:bookshelf", "descr":_("%(username)s books readed: %(bookshelf)s."),"counters":{"bookshelf":bookshelf.objects.filter(user=self.request.user).count(),"username":self.request.user.username}}, Loading Loading @@ -223,7 +225,7 @@ class CatalogsFeed(AuthFeed): books_count = books_list.count() # Получаем результирующий список op = OPDS_Paginator(catalogs_count, books_count, page_num, settings.MAXITEMS) op = OPDS_Paginator(catalogs_count, books_count, page_num, config.SOPDS_MAXITEMS) items = [] for row in catalogs_list[op.d1_first_pos:op.d1_last_pos+1]: Loading Loading @@ -372,7 +374,7 @@ class SearchBooksFeed(AuthFeed): subtitle = settings.SUBTITLE def title(self, obj): return "%s | %s (%s)"%(settings.TITLE,_("Books found"),_("doubles hide") if settings.DOUBLES_HIDE else _("doubles show")) return "%s | %s (%s)"%(settings.TITLE,_("Books found"),_("doubles hide") if config.SOPDS_DOUBLES_HIDE else _("doubles show")) def get_object(self, request, searchtype="m", searchterms=None, searchterms0=None, page=1): if not isinstance(page, int): Loading Loading @@ -423,7 +425,7 @@ class SearchBooksFeed(AuthFeed): books = Book.objects.filter(genres=genre_id).order_by('search_title','-docdate') # Поиск книг на книжной полке elif searchtype == 'u': if settings.AUTH: if config.SOPDS_AUTH: books = Book.objects.filter(bookshelf__user=request.user).order_by('-bookshelf__readtime') else: books=Book.objects.filter(id=0) Loading @@ -439,7 +441,7 @@ class SearchBooksFeed(AuthFeed): # Фильтруем дубликаты books_count = books.count() op = OPDS_Paginator(books_count, 0, page_num,settings.MAXITEMS) op = OPDS_Paginator(books_count, 0, page_num,config.SOPDS_MAXITEMS) items = [] prev_title = '' Loading @@ -447,7 +449,7 @@ class SearchBooksFeed(AuthFeed): # Начаинам анализ с последнего элемента на предидущей странице, чторбы он "вытянул" с этой страницы # свои дубликаты если они есть summary_DOUBLES_HIDE = settings.DOUBLES_HIDE and (searchtype != 'd') summary_DOUBLES_HIDE = config.SOPDS_DOUBLES_HIDE and (searchtype != 'd') start = op.d1_first_pos if ((op.d1_first_pos==0) or (not summary_DOUBLES_HIDE)) else op.d1_first_pos-1 finish = op.d1_last_pos Loading Loading @@ -534,9 +536,9 @@ class SearchBooksFeed(AuthFeed): opdsEnclosure(reverse("opds_catalog:download", kwargs={"book_id":item['id'],"zip_flag":1}),"application/%s+zip"%item['format'], "http://opds-spec.org/acquisition/open-access"), opdsEnclosure(reverse("opds_catalog:cover", kwargs={"book_id":item['id']}),"image/jpeg", "http://opds-spec.org/image"), ] if (settings.FB2TOEPUB!="") and (item['format']=='fb2'): if (config.SOPDS_FB2TOEPUB!="") and (item['format']=='fb2'): enclosure += [opdsEnclosure(reverse("opds_catalog:convert", kwargs={"book_id":item['id'],"convert_type":"epub"}),"application/epub+zip","http://opds-spec.org/acquisition/open-access")] if (settings.FB2TOMOBI!="") and (item['format']=='fb2'): if (config.SOPDS_FB2TOMOBI!="") and (item['format']=='fb2'): enclosure += [opdsEnclosure(reverse("opds_catalog:convert", kwargs={"book_id":item['id'],"convert_type":"mobi"}),"application/mobi","http://opds-spec.org/acquisition/open-access")] return enclosure Loading Loading @@ -634,7 +636,7 @@ class SearchAuthorsFeed(AuthFeed): # Создаем результирующее множество authors_count = authors.count() op = OPDS_Paginator(authors_count, 0, page_num, settings.MAXITEMS) op = OPDS_Paginator(authors_count, 0, page_num, config.SOPDS_MAXITEMS) items = [] for row in authors[op.d1_first_pos:op.d1_last_pos+1]: Loading Loading @@ -712,7 +714,7 @@ class SearchSeriesFeed(AuthFeed): # Создаем результирующее множество series_count = series.count() op = OPDS_Paginator(series_count, 0, page_num, settings.MAXITEMS) op = OPDS_Paginator(series_count, 0, page_num, config.SOPDS_MAXITEMS) items = [] for row in series[op.d1_first_pos:op.d1_last_pos+1]: Loading Loading @@ -860,7 +862,7 @@ class BooksFeed(AuthFeed): def item_link(self, item): title_full = len(item.id)<item.l if item.cnt>=settings.SPLITITEMS and not title_full: if item.cnt>=config.SOPDS_SPLITITEMS and not title_full: return reverse("opds_catalog:chars_books", kwargs={"lang_code":self.lang_code,"chars":item.id}) else: return reverse("opds_catalog:searchbooks", \ Loading Loading @@ -918,7 +920,7 @@ class AuthorsFeed(AuthFeed): def item_link(self, item): last_name_full = len(item.id)<item.l if (item.cnt>=settings.SPLITITEMS) and not last_name_full: if (item.cnt>=config.SOPDS_SPLITITEMS) and not last_name_full: return reverse("opds_catalog:chars_authors", kwargs={"lang_code":self.lang_code,"chars":item.id}) else: return reverse("opds_catalog:searchauthors", \ Loading Loading @@ -976,7 +978,7 @@ class SeriesFeed(AuthFeed): def item_link(self, item): series_full = len(item.id)<item.l if item.cnt>=settings.SPLITITEMS and not series_full: if item.cnt>=config.SOPDS_SPLITITEMS and not series_full: return reverse("opds_catalog:chars_series", kwargs={"lang_code":self.lang_code,"chars":item.id}) else: return reverse("opds_catalog:searchseries", \ Loading opds_catalog/inpx_parser.py +4 −3 Original line number Diff line number Diff line Loading @@ -7,7 +7,8 @@ Created on 14 нояб. 2016 г. # -*- coding: utf-8 -*- import os import zipfile from opds_catalog import settings #from opds_catalog import settings from constance import config sAuthor = 'AUTHOR' sGenre = 'GENRE' Loading @@ -32,8 +33,8 @@ class Inpx: self.inpx_itemseparator = ':' self.append_callback = append_callback self.inpskip_callback = inpskip_callback self.TEST_ZIP = settings.INPX_TEST_ZIP self.TEST_FILES = settings.INPX_TEST_FILES self.TEST_ZIP = config.SOPDS_INPX_TEST_ZIP self.TEST_FILES = config.SOPDS_INPX_TEST_FILES self.error = 0 def parse(self): Loading opds_catalog/management/commands/sopds_scanner.py +17 −16 Original line number Diff line number Diff line Loading @@ -14,8 +14,7 @@ from opds_catalog.models import Counter from opds_catalog.sopdscan import opdsScanner #from opds_catalog.settings import SCANNER_LOG, SCAN_SHED_DAY, SCAN_SHED_DOW, SCAN_SHED_HOUR, SCAN_SHED_MIN, LOGLEVEL, SCANNER_PID from opds_catalog import settings from constance import config class Command(BaseCommand): help = 'Scan Books Collection.' Loading @@ -26,7 +25,7 @@ class Command(BaseCommand): parser.add_argument('--daemon',action='store_true', dest='daemonize', default=False, help='Daemonize server') def handle(self, *args, **options): self.pidfile = os.path.join(main_settings.BASE_DIR, settings.SCANNER_PID) self.pidfile = os.path.join(main_settings.BASE_DIR, config.SOPDS_SCANNER_PID) action = options['command'] self.logger = logging.getLogger('') self.logger.setLevel(logging.DEBUG) Loading @@ -34,7 +33,7 @@ class Command(BaseCommand): if settings.LOGLEVEL!=logging.NOTSET: # Создаем обработчик для записи логов в файл fh = logging.FileHandler(settings.SCANNER_LOG) fh = logging.FileHandler(config.SOPDS_SCANNER_LOG) fh.setLevel(settings.LOGLEVEL) fh.setFormatter(formatter) self.logger.addHandler(fh) Loading Loading @@ -78,26 +77,28 @@ class Command(BaseCommand): Counter.objects.update_known_counters() def update_shedule(self): self.SCAN_SHED_DAY = settings.SCAN_SHED_DAY self.SCAN_SHED_DOW = settings.SCAN_SHED_DOW self.SCAN_SHED_HOUR = settings.SCAN_SHED_HOUR self.SCAN_SHED_MIN = settings.SCAN_SHED_MIN self.SCAN_SHED_DAY = config.SOPDS_SCAN_SHED_DAY self.SCAN_SHED_DOW = config.SOPDS_SCAN_SHED_DOW self.SCAN_SHED_HOUR = config.SOPDS_SCAN_SHED_HOUR self.SCAN_SHED_MIN = config.SOPDS_SCAN_SHED_MIN self.stdout.write('Reconfigure scheduled book-scan (min=%s, hour=%s, day_of_week=%s, day=%s).'%(self.SCAN_SHED_MIN,self.SCAN_SHED_HOUR,self.SCAN_SHED_DOW,self.SCAN_SHED_DAY)) self.sched.reschedule_job('scan', trigger='cron', day=self.SCAN_SHED_DAY, day_of_week=self.SCAN_SHED_DOW, hour=self.SCAN_SHED_HOUR, minute=self.SCAN_SHED_MIN) def check_settings(self): settings.constance_update_shedules() if self.SCAN_SHED_MIN==settings.SCAN_SHED_MIN and self.SCAN_SHED_HOUR==settings.SCAN_SHED_HOUR and self.SCAN_SHED_DOW==settings.SCAN_SHED_DOW and self.SCAN_SHED_DAY==settings.SCAN_SHED_DAY: return settings.constance_update_all() if self.SCAN_SHED_MIN==config.SOPDS_SCAN_SHED_MIN and \ self.SCAN_SHED_HOUR==config.SOPDS_SCAN_SHED_HOUR and \ self.SCAN_SHED_DOW==config.SOPDS_SCAN_SHED_DOW and \ self.SCAN_SHED_DAY==config.SOPDS_SCAN_SHED_DAY: return self.update_shedule() def start(self): writepid(self.pidfile) self.SCAN_SHED_DAY = settings.SCAN_SHED_DAY self.SCAN_SHED_DOW = settings.SCAN_SHED_DOW self.SCAN_SHED_HOUR = settings.SCAN_SHED_HOUR self.SCAN_SHED_MIN = settings.SCAN_SHED_MIN self.SCAN_SHED_DAY = config.SOPDS_SCAN_SHED_DAY self.SCAN_SHED_DOW = config.SOPDS_SCAN_SHED_DOW self.SCAN_SHED_HOUR = config.SOPDS_SCAN_SHED_HOUR self.SCAN_SHED_MIN = config.SOPDS_SCAN_SHED_MIN self.stdout.write('Startup scheduled book-scan (min=%s, hour=%s, day_of_week=%s, day=%s).'%(self.SCAN_SHED_MIN,self.SCAN_SHED_HOUR,self.SCAN_SHED_DOW,self.SCAN_SHED_DAY)) self.sched = BlockingScheduler() self.sched.add_job(self.scan, 'cron', day=self.SCAN_SHED_DAY, day_of_week=self.SCAN_SHED_DOW, hour=self.SCAN_SHED_HOUR, minute=self.SCAN_SHED_MIN, id='scan') Loading Loading @@ -141,7 +142,7 @@ def daemonize(): os.umask(0) std_in = open("/dev/null", 'r') std_out = open(settings.SCANNER_LOG, 'a+') std_out = open(config.SOPDS_SCANNER_LOG, 'a+') os.dup2(std_in.fileno(), sys.stdin.fileno()) os.dup2(std_out.fileno(), sys.stdout.fileno()) os.dup2(std_out.fileno(), sys.stderr.fileno()) Loading Loading
.travis.yml +0 −1 Original line number Diff line number Diff line Loading @@ -9,7 +9,6 @@ install: - travis_retry pip install -r requirements.txt script: - python manage.py migrate database - python manage.py test #branches: Loading
opds_catalog/dl.py +15 −14 Original line number Diff line number Diff line Loading @@ -11,15 +11,16 @@ from django.http import HttpResponse, Http404 from opds_catalog.models import Book, bookshelf from opds_catalog import settings, utils, opdsdb, fb2parse import opds_catalog.zipf as zipfile from constance import config def Download(request, book_id, zip_flag): """ Загрузка файла книги """ book = Book.objects.get(id=book_id) if settings.AUTH and request.user.is_authenticated(): if config.SOPDS_AUTH and request.user.is_authenticated(): bookshelf.objects.get_or_create(user=request.user, book=book) full_path=os.path.join(settings.ROOT_LIB,book.path) full_path=os.path.join(config.SOPDS_ROOT_LIB,book.path) if book.cat_type==opdsdb.CAT_INP: # Убираем из пути INPX файл Loading @@ -27,7 +28,7 @@ def Download(request, book_id, zip_flag): path, inpx_file = os.path.split(inpx_path) full_path = os.path.join(path,zip_name) if settings.TITLE_AS_FILENAME: if config.SOPDS_TITLE_AS_FILENAME: transname=utils.translit(book.title+'.'+book.format) else: transname=utils.translit(book.filename) Loading Loading @@ -98,7 +99,7 @@ def Cover(request, book_id): book = Book.objects.get(id=book_id) response = HttpResponse() c0=0 full_path=os.path.join(settings.ROOT_LIB,book.path) 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) Loading Loading @@ -132,9 +133,9 @@ def Cover(request, book_id): c0=0 if c0==0: if os.path.exists(settings.NOCOVER_PATH): if os.path.exists(config.SOPDS_NOCOVER_PATH): response["Content-Type"]='image/jpeg' f=open(settings.NOCOVER_PATH,"rb") f=open(config.SOPDS_NOCOVER_PATH,"rb") response.write(f.read()) f.close() else: Loading @@ -149,17 +150,17 @@ def ConvertFB2(request, book_id, convert_type): if book.format!='fb2': raise Http404 if settings.AUTH and request.user.is_authenticated(): if config.SOPDS_AUTH and request.user.is_authenticated(): bookshelf.objects.get_or_create(user=request.user, book=book) full_path=os.path.join(settings.ROOT_LIB,book.path) 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) full_path = os.path.join(path,zip_name) if settings.TITLE_AS_FILENAME: if config.SOPDS_TITLE_AS_FILENAME: transname=utils.translit(book.title+'.'+book.format) else: transname=utils.translit(book.filename) Loading @@ -170,10 +171,10 @@ def ConvertFB2(request, book_id, convert_type): dlfilename="%s.%s"%(n,convert_type) if convert_type=='epub': converter_path=settings.FB2TOEPUB converter_path=config.SOPDS_FB2TOEPUB content_type='application/epub+zip' elif convert_type=='mobi': converter_path=settings.FB2TOMOBI converter_path=config.SOPDS_FB2TOMOBI content_type='application/x-mobipocket-ebook' else: content_type='application/octet-stream' Loading @@ -187,11 +188,11 @@ def ConvertFB2(request, book_id, convert_type): except FileNotFoundError: raise Http404 z = zipfile.ZipFile(fz, 'r', allowZip64=True) z.extract(book.filename,settings.TEMP_DIR) tmp_fb2_path=os.path.join(settings.TEMP_DIR,book.filename) z.extract(book.filename,config.SOPDS_TEMP_DIR) tmp_fb2_path=os.path.join(config.SOPDS_TEMP_DIR,book.filename) file_path=tmp_fb2_path tmp_conv_path=os.path.join(settings.TEMP_DIR,dlfilename) tmp_conv_path=os.path.join(config.SOPDS_TEMP_DIR,dlfilename) popen_args = ("\"%s\" \"%s\" \"%s\""%(converter_path,file_path,tmp_conv_path)) proc = subprocess.Popen(popen_args, shell=True, stdout=subprocess.PIPE) #proc = subprocess.Popen((converter_path.encode('utf8'),file_path.encode('utf8'),tmp_conv_path.encode('utf8')), shell=True, stdout=subprocess.PIPE) Loading
opds_catalog/feeds.py +19 −17 Original line number Diff line number Diff line Loading @@ -15,11 +15,13 @@ from opds_catalog import settings from opds_catalog.opds_middleware import BasicAuthMiddleware from opds_catalog.opds_paginator import Paginator as OPDS_Paginator from constance import config class AuthFeed(Feed): request = None def __call__(self,request,*args,**kwargs): self.request = request if settings.AUTH: if config.SOPDS_AUTH: if request.user.is_authenticated(): return super().__call__(request,*args,**kwargs) Loading Loading @@ -159,16 +161,16 @@ class MainFeed(AuthFeed): mainitems = [ {"id":1, "title":_("By catalogs"), "link":"opds_catalog:catalogs", "descr": _("Catalogs: %(catalogs)s, books: %(books)s."),"counters":{"catalogs":Counter.objects.get_counter(models.counter_allcatalogs),"books":Counter.objects.get_counter(models.counter_allbooks)}}, {"id":2, "title":_("By authors"), "link":("opds_catalog:lang_authors" if settings.ALPHABET_MENU else "opds_catalog:nolang_authors"), {"id":2, "title":_("By authors"), "link":("opds_catalog:lang_authors" if config.SOPDS_ALPHABET_MENU else "opds_catalog:nolang_authors"), "descr": _("Authors: %(authors)s."),"counters":{"authors":Counter.objects.get_counter(models.counter_allauthors)}}, {"id":3, "title":_("By titles"), "link":("opds_catalog:lang_books" if settings.ALPHABET_MENU else "opds_catalog:nolang_books"), {"id":3, "title":_("By titles"), "link":("opds_catalog:lang_books" if config.SOPDS_ALPHABET_MENU else "opds_catalog:nolang_books"), "descr": _("Books: %(books)s."),"counters":{"books":Counter.objects.get_counter(models.counter_allbooks)}}, {"id":4, "title":_("By genres"), "link":"opds_catalog:genres", "descr": _("Genres: %(genres)s."),"counters":{"genres":Counter.objects.get_counter(models.counter_allgenres)}}, {"id":5, "title":_("By series"), "link":("opds_catalog:lang_series" if settings.ALPHABET_MENU else "opds_catalog:nolang_series"), {"id":5, "title":_("By series"), "link":("opds_catalog:lang_series" if config.SOPDS_ALPHABET_MENU else "opds_catalog:nolang_series"), "descr": _("Series: %(series)s."),"counters":{"series":Counter.objects.get_counter(models.counter_allseries)}}, ] if settings.AUTH and self.request.user.is_authenticated(): if config.SOPDS_AUTH and self.request.user.is_authenticated(): mainitems += [ {"id":6, "title":_("%(username)s Book shelf")%({"username":self.request.user.username}), "link":"opds_catalog:bookshelf", "descr":_("%(username)s books readed: %(bookshelf)s."),"counters":{"bookshelf":bookshelf.objects.filter(user=self.request.user).count(),"username":self.request.user.username}}, Loading Loading @@ -223,7 +225,7 @@ class CatalogsFeed(AuthFeed): books_count = books_list.count() # Получаем результирующий список op = OPDS_Paginator(catalogs_count, books_count, page_num, settings.MAXITEMS) op = OPDS_Paginator(catalogs_count, books_count, page_num, config.SOPDS_MAXITEMS) items = [] for row in catalogs_list[op.d1_first_pos:op.d1_last_pos+1]: Loading Loading @@ -372,7 +374,7 @@ class SearchBooksFeed(AuthFeed): subtitle = settings.SUBTITLE def title(self, obj): return "%s | %s (%s)"%(settings.TITLE,_("Books found"),_("doubles hide") if settings.DOUBLES_HIDE else _("doubles show")) return "%s | %s (%s)"%(settings.TITLE,_("Books found"),_("doubles hide") if config.SOPDS_DOUBLES_HIDE else _("doubles show")) def get_object(self, request, searchtype="m", searchterms=None, searchterms0=None, page=1): if not isinstance(page, int): Loading Loading @@ -423,7 +425,7 @@ class SearchBooksFeed(AuthFeed): books = Book.objects.filter(genres=genre_id).order_by('search_title','-docdate') # Поиск книг на книжной полке elif searchtype == 'u': if settings.AUTH: if config.SOPDS_AUTH: books = Book.objects.filter(bookshelf__user=request.user).order_by('-bookshelf__readtime') else: books=Book.objects.filter(id=0) Loading @@ -439,7 +441,7 @@ class SearchBooksFeed(AuthFeed): # Фильтруем дубликаты books_count = books.count() op = OPDS_Paginator(books_count, 0, page_num,settings.MAXITEMS) op = OPDS_Paginator(books_count, 0, page_num,config.SOPDS_MAXITEMS) items = [] prev_title = '' Loading @@ -447,7 +449,7 @@ class SearchBooksFeed(AuthFeed): # Начаинам анализ с последнего элемента на предидущей странице, чторбы он "вытянул" с этой страницы # свои дубликаты если они есть summary_DOUBLES_HIDE = settings.DOUBLES_HIDE and (searchtype != 'd') summary_DOUBLES_HIDE = config.SOPDS_DOUBLES_HIDE and (searchtype != 'd') start = op.d1_first_pos if ((op.d1_first_pos==0) or (not summary_DOUBLES_HIDE)) else op.d1_first_pos-1 finish = op.d1_last_pos Loading Loading @@ -534,9 +536,9 @@ class SearchBooksFeed(AuthFeed): opdsEnclosure(reverse("opds_catalog:download", kwargs={"book_id":item['id'],"zip_flag":1}),"application/%s+zip"%item['format'], "http://opds-spec.org/acquisition/open-access"), opdsEnclosure(reverse("opds_catalog:cover", kwargs={"book_id":item['id']}),"image/jpeg", "http://opds-spec.org/image"), ] if (settings.FB2TOEPUB!="") and (item['format']=='fb2'): if (config.SOPDS_FB2TOEPUB!="") and (item['format']=='fb2'): enclosure += [opdsEnclosure(reverse("opds_catalog:convert", kwargs={"book_id":item['id'],"convert_type":"epub"}),"application/epub+zip","http://opds-spec.org/acquisition/open-access")] if (settings.FB2TOMOBI!="") and (item['format']=='fb2'): if (config.SOPDS_FB2TOMOBI!="") and (item['format']=='fb2'): enclosure += [opdsEnclosure(reverse("opds_catalog:convert", kwargs={"book_id":item['id'],"convert_type":"mobi"}),"application/mobi","http://opds-spec.org/acquisition/open-access")] return enclosure Loading Loading @@ -634,7 +636,7 @@ class SearchAuthorsFeed(AuthFeed): # Создаем результирующее множество authors_count = authors.count() op = OPDS_Paginator(authors_count, 0, page_num, settings.MAXITEMS) op = OPDS_Paginator(authors_count, 0, page_num, config.SOPDS_MAXITEMS) items = [] for row in authors[op.d1_first_pos:op.d1_last_pos+1]: Loading Loading @@ -712,7 +714,7 @@ class SearchSeriesFeed(AuthFeed): # Создаем результирующее множество series_count = series.count() op = OPDS_Paginator(series_count, 0, page_num, settings.MAXITEMS) op = OPDS_Paginator(series_count, 0, page_num, config.SOPDS_MAXITEMS) items = [] for row in series[op.d1_first_pos:op.d1_last_pos+1]: Loading Loading @@ -860,7 +862,7 @@ class BooksFeed(AuthFeed): def item_link(self, item): title_full = len(item.id)<item.l if item.cnt>=settings.SPLITITEMS and not title_full: if item.cnt>=config.SOPDS_SPLITITEMS and not title_full: return reverse("opds_catalog:chars_books", kwargs={"lang_code":self.lang_code,"chars":item.id}) else: return reverse("opds_catalog:searchbooks", \ Loading Loading @@ -918,7 +920,7 @@ class AuthorsFeed(AuthFeed): def item_link(self, item): last_name_full = len(item.id)<item.l if (item.cnt>=settings.SPLITITEMS) and not last_name_full: if (item.cnt>=config.SOPDS_SPLITITEMS) and not last_name_full: return reverse("opds_catalog:chars_authors", kwargs={"lang_code":self.lang_code,"chars":item.id}) else: return reverse("opds_catalog:searchauthors", \ Loading Loading @@ -976,7 +978,7 @@ class SeriesFeed(AuthFeed): def item_link(self, item): series_full = len(item.id)<item.l if item.cnt>=settings.SPLITITEMS and not series_full: if item.cnt>=config.SOPDS_SPLITITEMS and not series_full: return reverse("opds_catalog:chars_series", kwargs={"lang_code":self.lang_code,"chars":item.id}) else: return reverse("opds_catalog:searchseries", \ Loading
opds_catalog/inpx_parser.py +4 −3 Original line number Diff line number Diff line Loading @@ -7,7 +7,8 @@ Created on 14 нояб. 2016 г. # -*- coding: utf-8 -*- import os import zipfile from opds_catalog import settings #from opds_catalog import settings from constance import config sAuthor = 'AUTHOR' sGenre = 'GENRE' Loading @@ -32,8 +33,8 @@ class Inpx: self.inpx_itemseparator = ':' self.append_callback = append_callback self.inpskip_callback = inpskip_callback self.TEST_ZIP = settings.INPX_TEST_ZIP self.TEST_FILES = settings.INPX_TEST_FILES self.TEST_ZIP = config.SOPDS_INPX_TEST_ZIP self.TEST_FILES = config.SOPDS_INPX_TEST_FILES self.error = 0 def parse(self): Loading
opds_catalog/management/commands/sopds_scanner.py +17 −16 Original line number Diff line number Diff line Loading @@ -14,8 +14,7 @@ from opds_catalog.models import Counter from opds_catalog.sopdscan import opdsScanner #from opds_catalog.settings import SCANNER_LOG, SCAN_SHED_DAY, SCAN_SHED_DOW, SCAN_SHED_HOUR, SCAN_SHED_MIN, LOGLEVEL, SCANNER_PID from opds_catalog import settings from constance import config class Command(BaseCommand): help = 'Scan Books Collection.' Loading @@ -26,7 +25,7 @@ class Command(BaseCommand): parser.add_argument('--daemon',action='store_true', dest='daemonize', default=False, help='Daemonize server') def handle(self, *args, **options): self.pidfile = os.path.join(main_settings.BASE_DIR, settings.SCANNER_PID) self.pidfile = os.path.join(main_settings.BASE_DIR, config.SOPDS_SCANNER_PID) action = options['command'] self.logger = logging.getLogger('') self.logger.setLevel(logging.DEBUG) Loading @@ -34,7 +33,7 @@ class Command(BaseCommand): if settings.LOGLEVEL!=logging.NOTSET: # Создаем обработчик для записи логов в файл fh = logging.FileHandler(settings.SCANNER_LOG) fh = logging.FileHandler(config.SOPDS_SCANNER_LOG) fh.setLevel(settings.LOGLEVEL) fh.setFormatter(formatter) self.logger.addHandler(fh) Loading Loading @@ -78,26 +77,28 @@ class Command(BaseCommand): Counter.objects.update_known_counters() def update_shedule(self): self.SCAN_SHED_DAY = settings.SCAN_SHED_DAY self.SCAN_SHED_DOW = settings.SCAN_SHED_DOW self.SCAN_SHED_HOUR = settings.SCAN_SHED_HOUR self.SCAN_SHED_MIN = settings.SCAN_SHED_MIN self.SCAN_SHED_DAY = config.SOPDS_SCAN_SHED_DAY self.SCAN_SHED_DOW = config.SOPDS_SCAN_SHED_DOW self.SCAN_SHED_HOUR = config.SOPDS_SCAN_SHED_HOUR self.SCAN_SHED_MIN = config.SOPDS_SCAN_SHED_MIN self.stdout.write('Reconfigure scheduled book-scan (min=%s, hour=%s, day_of_week=%s, day=%s).'%(self.SCAN_SHED_MIN,self.SCAN_SHED_HOUR,self.SCAN_SHED_DOW,self.SCAN_SHED_DAY)) self.sched.reschedule_job('scan', trigger='cron', day=self.SCAN_SHED_DAY, day_of_week=self.SCAN_SHED_DOW, hour=self.SCAN_SHED_HOUR, minute=self.SCAN_SHED_MIN) def check_settings(self): settings.constance_update_shedules() if self.SCAN_SHED_MIN==settings.SCAN_SHED_MIN and self.SCAN_SHED_HOUR==settings.SCAN_SHED_HOUR and self.SCAN_SHED_DOW==settings.SCAN_SHED_DOW and self.SCAN_SHED_DAY==settings.SCAN_SHED_DAY: return settings.constance_update_all() if self.SCAN_SHED_MIN==config.SOPDS_SCAN_SHED_MIN and \ self.SCAN_SHED_HOUR==config.SOPDS_SCAN_SHED_HOUR and \ self.SCAN_SHED_DOW==config.SOPDS_SCAN_SHED_DOW and \ self.SCAN_SHED_DAY==config.SOPDS_SCAN_SHED_DAY: return self.update_shedule() def start(self): writepid(self.pidfile) self.SCAN_SHED_DAY = settings.SCAN_SHED_DAY self.SCAN_SHED_DOW = settings.SCAN_SHED_DOW self.SCAN_SHED_HOUR = settings.SCAN_SHED_HOUR self.SCAN_SHED_MIN = settings.SCAN_SHED_MIN self.SCAN_SHED_DAY = config.SOPDS_SCAN_SHED_DAY self.SCAN_SHED_DOW = config.SOPDS_SCAN_SHED_DOW self.SCAN_SHED_HOUR = config.SOPDS_SCAN_SHED_HOUR self.SCAN_SHED_MIN = config.SOPDS_SCAN_SHED_MIN self.stdout.write('Startup scheduled book-scan (min=%s, hour=%s, day_of_week=%s, day=%s).'%(self.SCAN_SHED_MIN,self.SCAN_SHED_HOUR,self.SCAN_SHED_DOW,self.SCAN_SHED_DAY)) self.sched = BlockingScheduler() self.sched.add_job(self.scan, 'cron', day=self.SCAN_SHED_DAY, day_of_week=self.SCAN_SHED_DOW, hour=self.SCAN_SHED_HOUR, minute=self.SCAN_SHED_MIN, id='scan') Loading Loading @@ -141,7 +142,7 @@ def daemonize(): os.umask(0) std_in = open("/dev/null", 'r') std_out = open(settings.SCANNER_LOG, 'a+') std_out = open(config.SOPDS_SCANNER_LOG, 'a+') os.dup2(std_in.fileno(), sys.stdin.fileno()) os.dup2(std_out.fileno(), sys.stdout.fileno()) os.dup2(std_out.fileno(), sys.stderr.fileno()) Loading