2019-12-31 15:24:20 +00:00
import os
import re
import cherrypy
import stat
import zipfile
from lib . rarfile import rarfile
import mylar
2020-01-09 18:22:52 +00:00
try :
from PIL import Image
except ImportError :
logger . debug ( " WebReader Requested, but PIL or pillow libraries must be installed. Please execute ' pip install pillow ' , then restart Mylar. " )
return serve_template ( templatename = " index.html " , title = " Home " , comics = comics , alphaindex = mylar . CONFIG . ALPHAINDEX )
2019-12-31 15:24:20 +00:00
from mylar import logger , db , importer , mb , search , filechecker , helpers , updater , parseit , weeklypull , librarysync , moveit , Failed , readinglist , config
from mylar . webserve import serve_template
class WebViewer ( object ) :
def __init__ ( self ) :
self . ish_id = None
self . page_num = None
self . kwargs = None
self . data = None
if not os . path . exists ( os . path . join ( mylar . DATA_DIR , ' sessions ' ) ) :
os . makedirs ( os . path . abspath ( os . path . join ( mylar . DATA_DIR , ' sessions ' ) ) )
updatecherrypyconf = {
' tools.gzip.on ' : True ,
' tools.gzip.mime_types ' : [ ' text/* ' , ' application/* ' , ' image/* ' ] ,
' tools.sessions.timeout ' : 1440 ,
' tools.sessions.storage_class ' : cherrypy . lib . sessions . FileSession ,
' tools.sessions.storage_path ' : os . path . join ( mylar . DATA_DIR , " sessions " ) ,
' request.show_tracebacks ' : False ,
2020-01-13 19:50:13 +00:00
' engine.timeout_monitor.on ' : False ,
2019-12-31 15:24:20 +00:00
}
if mylar . CONFIG . HTTP_PASSWORD is None :
updatecherrypyconf . update ( {
' tools.sessions.on ' : True ,
} )
cherrypy . config . update ( updatecherrypyconf )
cherrypy . engine . signals . subscribe ( )
def read_comic ( self , ish_id = None , page_num = None , size = None ) :
logger . debug ( " WebReader Requested, looking for ish_id %s and page_num %s " % ( ish_id , page_num ) )
if size == None :
user_size_pref = ' wide '
else :
user_size_pref = size
try :
ish_id
except :
logger . warn ( " WebReader: ish_id not set! " )
myDB = db . DBConnection ( )
comic = myDB . selectone ( ' select comics.ComicLocation, issues.Location from comics, issues where comics.comicid = issues.comicid and issues.issueid = ? ' , [ ish_id ] ) . fetchone ( )
if comic is None :
logger . warn ( " WebReader: ish_id %s requested but not in the database! " % ish_id )
raise cherrypy . HTTPRedirect ( " home " )
# cherrypy.config.update()
comic_path = os . path . join ( comic [ ' ComicLocation ' ] , comic [ ' Location ' ] )
logger . debug ( " WebReader found ish_id %s at %s " % ( ish_id , comic_path ) )
# cherrypy.session['ish_id'].load()
# if 'sizepref' not in cherrypy.session:
# cherrypy.session['sizepref'] = user_size_pref
# user_size_pref = cherrypy.session['sizepref']
# logger.debug("WebReader setting user_size_pref to %s" % user_size_pref)
scanner = ComicScanner ( )
image_list = scanner . reading_images ( ish_id )
logger . debug ( " Image list contains %s pages " % ( len ( image_list ) ) )
if len ( image_list ) == 0 :
logger . debug ( " Unpacking ish_id %s from comic_path %s " % ( ish_id , comic_path ) )
scanner . user_unpack_comic ( ish_id , comic_path )
else :
logger . debug ( " ish_id %s already unpacked. " % ish_id )
num_pages = len ( image_list )
logger . debug ( " Found %s pages for ish_id %s from comic_path %s " % ( num_pages , ish_id , comic_path ) )
if num_pages == 0 :
image_list = [ ' images/skipped_icon.png ' ]
cookie_comic = re . sub ( r ' \ W+ ' , ' ' , comic_path )
cookie_comic = " wv_ " + cookie_comic . decode ( ' unicode_escape ' )
logger . debug ( " about to drop a cookie for " + cookie_comic + " which represents " + comic_path )
cookie_check = cherrypy . request . cookie
if cookie_comic not in cookie_check :
logger . debug ( " Cookie Creation " )
cookie_path = ' / '
cookie_maxage = ' 2419200 '
cookie_set = cherrypy . response . cookie
cookie_set [ ' cookie_comic ' ] = 0
cookie_set [ ' cookie_comic ' ] [ ' path ' ] = cookie_path . decode ( ' unicode_escape ' )
cookie_set [ ' cookie_comic ' ] [ ' max-age ' ] = cookie_maxage . decode ( ' unicode_escape ' )
next_page = page_num + 1
prev_page = page_num - 1
else :
logger . debug ( " Cookie Read " )
page_num = int ( cherrypy . request . cookie [ ' cookie_comic ' ] . value )
logger . debug ( " Cookie Set To %d " % page_num )
next_page = page_num + 1
prev_page = page_num - 1
logger . info ( " Reader Served " )
logger . debug ( " Serving comic " + comic [ ' Location ' ] + " page number " + str ( page_num ) )
return serve_template ( templatename = " read.html " , pages = image_list , current_page = page_num , np = next_page , pp = prev_page , nop = num_pages , size = user_size_pref , cc = cookie_comic , comicpath = comic_path , ish_id = ish_id )
def up_size_pref ( self , pref ) :
cherrypy . session . load ( )
cherrypy . session [ ' sizepref ' ] = pref
cherrypy . session . save ( )
return
class ComicScanner ( object ) :
# This method will handle scanning the directories and returning a list of them all.
def dir_scan ( self ) :
logger . debug ( " Dir Scan Requested " )
full_paths = [ ]
full_paths . append ( mylar . CONFIG . DESTINATION_DIR )
for root , dirs , files in os . walk ( mylar . CONFIG . DESTINATION_DIR ) :
full_paths . extend ( os . path . join ( root , d ) for d in dirs )
logger . info ( " Dir Scan Completed " )
logger . info ( " %i Dirs Found " % ( len ( full_paths ) ) )
return full_paths
def user_unpack_comic ( self , ish_id , comic_path ) :
logger . info ( " %s unpack requested " % comic_path )
for root , dirs , files in os . walk ( os . path . join ( mylar . CONFIG . CACHE_DIR , " webviewer " , ish_id ) , topdown = False ) :
for f in files :
os . chmod ( os . path . join ( root , f ) , stat . S_IRWXU | stat . S_IRWXG | stat . S_IRWXO ) # 0777
os . remove ( os . path . join ( root , f ) )
for root , dirs , files in os . walk ( os . path . join ( mylar . CONFIG . CACHE_DIR , " webviewer " , ish_id ) , topdown = False ) :
for d in dirs :
os . chmod ( os . path . join ( root , d ) , stat . S_IRWXU | stat . S_IRWXG | stat . S_IRWXO ) # 0777
os . rmdir ( os . path . join ( root , d ) )
if comic_path . endswith ( " .cbr " ) :
opened_rar = rarfile . RarFile ( comic_path )
opened_rar . extractall ( os . path . join ( mylar . CONFIG . CACHE_DIR , " webviewer " , ish_id ) )
elif comic_path . endswith ( " .cbz " ) :
opened_zip = zipfile . ZipFile ( comic_path )
opened_zip . extractall ( os . path . join ( mylar . CONFIG . CACHE_DIR , " webviewer " , ish_id ) )
return
# This method will return a list of .jpg files in their numberical order to be fed into the reading view.
def reading_images ( self , ish_id ) :
logger . debug ( " Image List Requested " )
image_list = [ ]
image_src = os . path . join ( mylar . CONFIG . CACHE_DIR , " webviewer " , ish_id )
image_loc = os . path . join ( mylar . CONFIG . HTTP_ROOT , ' cache ' , " webviewer " , ish_id )
for root , dirs , files in os . walk ( image_src ) :
for f in files :
if f . endswith ( ( " .png " , " .gif " , " .bmp " , " .dib " , " .jpg " , " .jpeg " , " .jpe " , " .jif " , " .jfif " , " .jfi " , " .tiff " , " .tif " ) ) :
image_list . append ( os . path . join ( image_loc , f ) )
image_list . sort ( )
logger . debug ( " Image List Created " )
return image_list