2023-11-21 20:16:10 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								""" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Webshot  module  for  Inkycal  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								by  https : / / github . com / worstface  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								""" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  htmlwebshot  import  WebShot  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  inkycal . custom  import  *  
						 
					
						
							
								
									
										
										
										
											2024-02-10 22:43:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  inkycal . modules . inky_image  import  Inkyimage  as  Images ,  image_to_palette  
						 
					
						
							
								
									
										
										
										
											2023-11-21 20:16:10 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								from  inkycal . modules . template  import  inkycal_module  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  tests  import  Config  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								logger  =  logging . getLogger ( __name__ )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  Webshot ( inkycal_module ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    name  =  " Webshot - Displays screenshots of webpages " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # required parameters 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    requires  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " url " :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " label " :  " Please enter the url " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " palette " :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " label " :  " Which color palette should be used for the webshots? " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " options " :  [ " bw " ,  " bwr " ,  " bwy " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    optional  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " crop_x " :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " label " :  " Please enter the crop x-position " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " crop_y " :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " label " :  " Please enter the crop y-position " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " crop_w " :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " label " :  " Please enter the crop width " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " crop_h " :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " label " :  " Please enter the crop height " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  __init__ ( self ,  config ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        super ( ) . __init__ ( config ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        config  =  config [ ' config ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        self . url  =  config [ ' url ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        self . palette  =  config [ ' palette ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  " crop_h "  in  config  and  isinstance ( config [ " crop_h " ] ,  str ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . crop_h  =  int ( config [ " crop_h " ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . crop_h  =  2000 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  " crop_w "  in  config  and  isinstance ( config [ " crop_w " ] ,  str ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . crop_w  =  int ( config [ " crop_w " ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . crop_w  =  2000 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  " crop_x "  in  config  and  isinstance ( config [ " crop_x " ] ,  str ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . crop_x  =  int ( config [ " crop_x " ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . crop_x  =  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  " crop_y "  in  config  and  isinstance ( config [ " crop_y " ] ,  str ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . crop_y  =  int ( config [ " crop_y " ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            self . crop_y  =  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # give an OK message 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        print ( f ' Inkycal webshot loaded ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  generate_image ( self ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        """ Generate image for this module """ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Create tmp path 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        tmpFolder  =  Config . TEMP_PATH 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  not  os . path . exists ( tmpFolder ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            print ( f " Creating tmp directory  { tmpFolder } " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            os . mkdir ( tmpFolder ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Define new image size with respect to padding 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        im_width  =  int ( self . width  -  ( 2  *  self . padding_left ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        im_height  =  int ( self . height  -  ( 2  *  self . padding_top ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        im_size  =  im_width ,  im_height 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        logger . info ( ' image size:  {}  x  {}  px ' . format ( im_width ,  im_height ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Create an image for black pixels and one for coloured pixels (required) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        im_black  =  Image . new ( ' RGB ' ,  size = im_size ,  color = ' white ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        im_colour  =  Image . new ( ' RGB ' ,  size = im_size ,  color = ' white ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Check if internet is available 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  internet_available ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            logger . info ( ' Connection test passed ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            raise  Exception ( ' Network could not be reached :/ ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        logger . info ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            f ' preparing webshot from  { self . url } ... cropH { self . crop_h }  cropW { self . crop_w }  cropX { self . crop_x }  cropY { self . crop_y } ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        shot  =  WebShot ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        shot . params  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " --crop-x " :  self . crop_x , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " --crop-y " :  self . crop_y , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " --crop-w " :  self . crop_w , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " --crop-h " :  self . crop_h , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        logger . info ( f ' getting webshot from  { self . url } ... ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            shot . create_pic ( url = self . url ,  output = f " { tmpFolder } /webshot.png " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        except : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            print ( traceback . format_exc ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            print ( " If you have not already installed wkhtmltopdf, please use: sudo apt-get install wkhtmltopdf. See here for more details: https://github.com/1Danish-00/htmlwebshot/ " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            raise  Exception ( ' Could not get webshot :/ ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        logger . info ( f ' got webshot... ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        webshotSpaceBlack  =  Image . new ( ' RGBA ' ,  ( im_width ,  im_height ) ,  ( 255 ,  255 ,  255 ,  255 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        webshotSpaceColour  =  Image . new ( ' RGBA ' ,  ( im_width ,  im_height ) ,  ( 255 ,  255 ,  255 ,  255 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        im  =  Images ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        im . load ( f ' { tmpFolder } /webshot.png ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        im . remove_alpha ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        imageAspectRatio  =  im_width  /  im_height 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        webshotAspectRatio  =  im . image . width  /  im . image . height 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  webshotAspectRatio  >  imageAspectRatio : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            imageScale  =  im_width  /  im . image . width 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            imageScale  =  im_height  /  im . image . height 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        webshotHeight  =  int ( im . image . height  *  imageScale ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        im . resize ( width = int ( im . image . width  *  imageScale ) ,  height = webshotHeight ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-02-10 22:43:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        im_webshot_black ,  im_webshot_colour  =  image_to_palette ( im . image . convert ( " RGB " ) ,  self . palette ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-21 20:16:10 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        webshotCenterPosY  =  int ( ( im_height  /  2 )  -  ( im . image . height  /  2 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        centerPosX  =  int ( ( im_width  /  2 )  -  ( im . image . width  /  2 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        webshotSpaceBlack . paste ( im_webshot_black ,  ( centerPosX ,  webshotCenterPosY ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        im_black . paste ( webshotSpaceBlack ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        webshotSpaceColour . paste ( im_webshot_colour ,  ( centerPosX ,  webshotCenterPosY ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        im_colour . paste ( webshotSpaceColour ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        im . clear ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        logger . info ( f ' added webshot image ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Save image of black and colour channel in image-folder 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  im_black ,  im_colour