Commit 4e6a2299 authored by mitshel's avatar mitshel
Browse files

Create functional for show covers "on the fly".

parent eca91d7e
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -34,16 +34,17 @@ fb2parse = yes
# При просмотре каталога OPDS-клиентом извлеченная обложка будет показываться показывается
# если cover_show = 1 или 3
# Установка этой опции значительно замедляет сканирование каталога (~ в 10 раз)
# Следует использовать при значительной нагрузке на OPDS-каталог или если 
# Но зато обложки в OPDS-клиенте будут загружаться практически мгновенно
cover_extract = yes
cover_enable = yes

# cover_show - способ показа обложек:
# 0 - не показывать, 
# 0 - не показывать (значение по умолчанию), 
# 1 - показывать заранее извлеченные обложки, 
# 2 - извлекать обложки на лету и показывать 
# 3 - показать ранее извлеченную обложку, если обложка не извлекалась, то извелеч на лету и показать
cover_show = 2
# 3 - показать ранее извлеченную обложку, если обложка не извлекалась, то извелечь на лету и показать
# 
# Думаю оптимально использовать cover_show = 1 и cover_extract = yes
cover_show = 1

# Предположительно столько байт от начала файла fb2 необходимо считать, чтобы получить необходимую метаинформацию (только description), если 0 то парсится весь файл
# при использование числа отличного от 0 возможны ошибки (например description очень длинный и занимает более, чем указанное число байт)
+2 −2
Original line number Diff line number Diff line
@@ -130,7 +130,7 @@ def processfile(db,fb2,name,full_path,file,archive=0):
          book_id=opdsdb.addbook(name,rel_path,cat_id,e,title,genre,lang,0,archive)
          books_added+=1
          
          if e.lower()=='.fb2' and cfg.FB2PARSE and cfg.COVER_ENABLE:
          if e.lower()=='.fb2' and cfg.FB2PARSE and cfg.COVER_EXTRACT:
             create_cover(book_id,fb2,opdsdb)
          
          if archive==1:
@@ -182,7 +182,7 @@ opdsdb.openDB()
if VERBOSE:
   opdsdb.printDBerr()

fb2parser=sopdsparse.fb2parser(cfg.COVER_ENABLE)
fb2parser=sopdsparse.fb2parser(cfg.COVER_EXTRACT)

extensions_set={x for x in cfg.EXT_LIST}
if VERBOSE:
+65 −11
Original line number Diff line number Diff line
@@ -12,6 +12,8 @@ import zipfile
import io
import locale
import time
import sopdsparse
import base64

#######################################################################
#
@@ -85,14 +87,25 @@ def main_menu():
   enc_print('<id>sopds.cgi?id=4</id></entry>')
   opdsdb.closeDB()

def covers(cover,cover_type):
def covers(cover,cover_type,book_id):
   have_extracted_cover=0
   if cfg.COVER_SHOW!=0:
      if cfg.COVER_SHOW!=2:
         if cover!=None and cover!='':
            enc_print( '<link href="../covers/%s" rel="http://opds-spec.org/image" type="%s" />'%(cover,cover_type) )
            enc_print( '<link href="../covers/%s" rel="x-stanza-cover-image" type="%s" />'%(cover,cover_type) )
            enc_print( '<link href="../covers/%s" rel="http://opds-spec.org/thumbnail" type="%s" />'%(cover,cover_type) )
            enc_print( '<link href="../covers/%s" rel="x-stanza-cover-image-thumbnail" type="%s" />'%(cover,cover_type) )
            have_extracted_cover=1
      if cfg.COVER_SHOW==2 or (cfg.COVER_SHOW==3 and have_extracted_cover==0):
            id='99'+str(book_id)
            enc_print( '<link href="sopds.cgi?id=%s" rel="http://opds-spec.org/image" />'%(id) )
            enc_print( '<link href="sopds.cgi?id=%s" rel="x-stanza-cover-image" />'%(id) )
            enc_print( '<link href="sopds.cgi?id=%s" rel="http://opds-spec.org/thumbnail" />'%(id) )
            enc_print( '<link href="sopds.cgi?id=%s" rel="x-stanza-cover-image-thumbnail" />'%(id) )

###########################################################################

###########################################################################################################
# Основной код программы
#

@@ -252,7 +265,7 @@ if type_value==10:
       enc_print('<title>'+websym(book_title)+'</title>')
       enc_print('<updated>'+reg_date.strftime("%Y-%m-%dT%H:%M:%SZ")+'</updated>')
       enc_print('<id>sopds.cgi?id='+id+'</id>')
       covers(cover,cover_type)
       covers(cover,cover_type,book_id)
       enc_print('<link type="application/atom+xml" rel="alternate" href="sopds.cgi?id='+id+'"/>')
       enc_print('<link type="application/atom+xml;profile=opds-catalog;kind=acquisition" rel="subsection" href="sopds.cgi?id='+id+'"/>')
       authors=""
@@ -346,7 +359,7 @@ if type_value==6:
       enc_print('<title>'+websym(book_title)+'</title>')
       enc_print('<updated>'+reg_date.strftime("%Y-%m-%dT%H:%M:%SZ")+'</updated>')
       enc_print('<id>sopds.cgi?id='+id+'</id>')
       covers(cover,cover_type)
       covers(cover,cover_type,book_id)
       enc_print('<link type="application/atom+xml" rel="alternate" href="sopds.cgi?id='+id+'"/>')
       enc_print('<link type="application/atom+xml;profile=opds-catalog;kind=acquisition" rel="subsection" href="sopds.cgi?id='+id+'"/>')
       authors=""
@@ -383,7 +396,7 @@ elif type_value==7:
   idzip='09'+str(slice_value)
   enc_print('<entry>')
   enc_print('<title>Файл: '+book_name+'</title>')
   covers(cover,cover_type)
   covers(cover,cover_type,slice_value)
   enc_print('<link type="application/'+format+'" rel="alternate" href="sopds.cgi?id='+id+'"/>')
   enc_print('<link type="application/'+format+'" href="sopds.cgi?id='+id+'" rel="http://opds-spec.org/acquisition" />')
   enc_print('<link type="application/'+format+'+zip" href="sopds.cgi?id='+idzip+'" rel="http://opds-spec.org/acquisition" />')
@@ -481,4 +494,45 @@ elif type_value==9:

   opdsdb.closeDB()

#########################################################
# Выдача Обложки На лету
#
elif type_value==99:
   opdsdb=sopdsdb.opdsDatabase(cfg.DB_NAME,cfg.DB_USER,cfg.DB_PASS,cfg.DB_HOST,cfg.ROOT_LIB)
   opdsdb.openDB()
   (book_name,book_path,reg_date,format,title,cat_type,cover,cover_type)=opdsdb.getbook(slice_value)
   c0=0
   if format=='fb2':
      full_path=os.path.join(cfg.ROOT_LIB,book_path)
      fb2=sopdsparse.fb2parser(1)
      if cat_type==sopdsdb.CAT_NORMAL:
         file_path=os.path.join(full_path,book_name)
         fo=codecs.open(file_path.encode("utf-8"), "rb")
         fb2.parse(fo,0)
         fo.close()
      elif cat_type==sopdsdb.CAT_ZIP:
         fz=codecs.open(full_path.encode("utf-8"), "rb")
         z = zipfile.ZipFile(fz, 'r')
         fo = z.open(book_name)
         fb2.parse(fo,0)
         fo.close()
         z.close()
         fz.close()

      if len(fb2.cover_image.cover_data)>0:
         s=fb2.cover_image.cover_data
         dstr=base64.b64decode(s)
         ictype=fb2.cover_image.getattr('content-type')
         enc_print('Content-Type:'+ictype)
         enc_print()
         sys.stdout.buffer.write(dstr)
         c0=1

   if c0==0: 
      enc_print('Content-Type: text/plain')
      enc_print()
      enc_print('No Cover')

   opdsdb.closeDB()

+11 −3
Original line number Diff line number Diff line
@@ -36,15 +36,17 @@ class cfgreader:
       self.DB_CHARSET=config.get(CFG_S_GLOBAL,'db_charset')
       self.ROOT_LIB=os.path.abspath(config.get(CFG_S_GLOBAL,'root_lib'))
       self.FORMATS=config.get(CFG_S_GLOBAL,'formats')
       self.DUBLICATES=config.getboolean(CFG_S_GLOBAL,'dublicates')
       self.DUBLICATES_FIND=config.getboolean(CFG_S_GLOBAL,'dublicates_find')
       self.DUBLICATES_SHOW=config.getboolean(CFG_S_GLOBAL,'dublicates_show')
       self.FB2PARSE=config.getboolean(CFG_S_GLOBAL,'fb2parse')
       self.ZIPSCAN=config.getboolean(CFG_S_GLOBAL,'zipscan')
       self.ZIPRESCAN=config.getboolean(CFG_S_GLOBAL,'ziprescan')
       self.COVER_ENABLE=config.getboolean(CFG_S_GLOBAL,'cover_enable')
       self.COVER_EXTRACT=config.getboolean(CFG_S_GLOBAL,'cover_extract')
       fb2hsize=config.get(CFG_S_GLOBAL,'fb2hsize')
       maxitems=config.get(CFG_S_GLOBAL,'maxitems')
       splitauthors=config.get(CFG_S_GLOBAL,'splitauthors')
       splittitles=config.get(CFG_S_GLOBAL,'splittitles')
       cover_show=config.get(CFG_S_GLOBAL,'cover_show')

       if maxitems.isdigit():
          self.MAXITEMS=int(maxitems)
@@ -56,7 +58,7 @@ class cfgreader:
       else:
          self.FB2HSIZE=0

       if self.COVER_ENABLE:
       if self.COVER_EXTRACT:
          self.FB2SIZE=0

       if splitauthors.isdigit():
@@ -69,6 +71,12 @@ class cfgreader:
       else:
          self.SPLITTITLES=0

       if cover_show.isdigit():
          self.COVER_SHOW=int(cover_show)
       else:
          self.COVER_SHOW=0
      

       self.EXT_LIST=self.FORMATS.lower().split()

       CFG_S_SITE='site'