| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  | __filename__ = "daemon_get_images.py" | 
					
						
							|  |  |  | __author__ = "Bob Mottram" | 
					
						
							|  |  |  | __license__ = "AGPL3+" | 
					
						
							|  |  |  | __version__ = "1.5.0" | 
					
						
							|  |  |  | __maintainer__ = "Bob Mottram" | 
					
						
							|  |  |  | __email__ = "bob@libreserver.org" | 
					
						
							|  |  |  | __status__ = "Production" | 
					
						
							| 
									
										
										
										
											2024-03-23 15:11:05 +00:00
										 |  |  | __module_group__ = "Core GET" | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | import datetime | 
					
						
							| 
									
										
										
										
											2024-03-03 11:38:54 +00:00
										 |  |  | import time | 
					
						
							|  |  |  | from shutil import copyfile | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  | from media import path_is_video | 
					
						
							|  |  |  | from media import path_is_transcript | 
					
						
							|  |  |  | from media import path_is_audio | 
					
						
							|  |  |  | from httpcodes import write2 | 
					
						
							|  |  |  | from httpcodes import http_304 | 
					
						
							|  |  |  | from httpcodes import http_404 | 
					
						
							|  |  |  | from httpheaders import set_headers_etag | 
					
						
							| 
									
										
										
										
											2024-05-12 12:35:26 +00:00
										 |  |  | from utils import data_dir | 
					
						
							| 
									
										
										
										
											2024-03-03 11:38:54 +00:00
										 |  |  | from utils import get_nickname_from_actor | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  | from utils import media_file_mime_type | 
					
						
							|  |  |  | from utils import get_image_mime_type | 
					
						
							|  |  |  | from utils import get_image_extensions | 
					
						
							|  |  |  | from utils import acct_dir | 
					
						
							|  |  |  | from utils import is_image_file | 
					
						
							|  |  |  | from daemon_utils import etag_exists | 
					
						
							|  |  |  | from fitnessFunctions import fitness_performance | 
					
						
							| 
									
										
										
										
											2024-03-03 11:38:54 +00:00
										 |  |  | from person import save_person_qrcode | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def show_avatar_or_banner(self, referer_domain: str, path: str, | 
					
						
							|  |  |  |                           base_dir: str, domain: str, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                           getreq_start_time, fitness: {}, | 
					
						
							|  |  |  |                           debug: bool) -> bool: | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |     """Shows an avatar or banner or profile background image
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if '/users/' not in path: | 
					
						
							|  |  |  |         if '/system/accounts/avatars/' not in path and \ | 
					
						
							|  |  |  |            '/system/accounts/headers/' not in path and \ | 
					
						
							|  |  |  |            '/accounts/avatars/' not in path and \ | 
					
						
							|  |  |  |            '/accounts/headers/' not in path: | 
					
						
							|  |  |  |             return False | 
					
						
							|  |  |  |     if not is_image_file(path): | 
					
						
							|  |  |  |         return False | 
					
						
							|  |  |  |     if '/system/accounts/avatars/' in path: | 
					
						
							|  |  |  |         avatar_str = path.split('/system/accounts/avatars/')[1] | 
					
						
							|  |  |  |     elif '/accounts/avatars/' in path: | 
					
						
							|  |  |  |         avatar_str = path.split('/accounts/avatars/')[1] | 
					
						
							|  |  |  |     elif '/system/accounts/headers/' in path: | 
					
						
							|  |  |  |         avatar_str = path.split('/system/accounts/headers/')[1] | 
					
						
							|  |  |  |     elif '/accounts/headers/' in path: | 
					
						
							|  |  |  |         avatar_str = path.split('/accounts/headers/')[1] | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         avatar_str = path.split('/users/')[1] | 
					
						
							|  |  |  |     if not ('/' in avatar_str and '.temp.' not in path): | 
					
						
							|  |  |  |         return False | 
					
						
							|  |  |  |     avatar_nickname = avatar_str.split('/')[0] | 
					
						
							|  |  |  |     avatar_file = avatar_str.split('/')[1] | 
					
						
							|  |  |  |     avatar_file_ext = avatar_file.split('.')[-1] | 
					
						
							|  |  |  |     # remove any numbers, eg. avatar123.png becomes avatar.png | 
					
						
							|  |  |  |     if avatar_file.startswith('avatar'): | 
					
						
							|  |  |  |         avatar_file = 'avatar.' + avatar_file_ext | 
					
						
							|  |  |  |     elif avatar_file.startswith('banner'): | 
					
						
							|  |  |  |         avatar_file = 'banner.' + avatar_file_ext | 
					
						
							|  |  |  |     elif avatar_file.startswith('search_banner'): | 
					
						
							|  |  |  |         avatar_file = 'search_banner.' + avatar_file_ext | 
					
						
							|  |  |  |     elif avatar_file.startswith('image'): | 
					
						
							|  |  |  |         avatar_file = 'image.' + avatar_file_ext | 
					
						
							|  |  |  |     elif avatar_file.startswith('left_col_image'): | 
					
						
							|  |  |  |         avatar_file = 'left_col_image.' + avatar_file_ext | 
					
						
							|  |  |  |     elif avatar_file.startswith('right_col_image'): | 
					
						
							|  |  |  |         avatar_file = 'right_col_image.' + avatar_file_ext | 
					
						
							|  |  |  |     avatar_filename = \ | 
					
						
							|  |  |  |         acct_dir(base_dir, avatar_nickname, domain) + '/' + avatar_file | 
					
						
							|  |  |  |     if not os.path.isfile(avatar_filename): | 
					
						
							|  |  |  |         original_ext = avatar_file_ext | 
					
						
							|  |  |  |         original_avatar_file = avatar_file | 
					
						
							|  |  |  |         alt_ext = get_image_extensions() | 
					
						
							|  |  |  |         alt_found = False | 
					
						
							|  |  |  |         for alt in alt_ext: | 
					
						
							|  |  |  |             if alt == original_ext: | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             avatar_file = \ | 
					
						
							|  |  |  |                 original_avatar_file.replace('.' + original_ext, | 
					
						
							|  |  |  |                                              '.' + alt) | 
					
						
							|  |  |  |             avatar_filename = \ | 
					
						
							|  |  |  |                 acct_dir(base_dir, avatar_nickname, domain) + \ | 
					
						
							|  |  |  |                 '/' + avatar_file | 
					
						
							|  |  |  |             if os.path.isfile(avatar_filename): | 
					
						
							|  |  |  |                 alt_found = True | 
					
						
							|  |  |  |                 break | 
					
						
							|  |  |  |         if not alt_found: | 
					
						
							|  |  |  |             return False | 
					
						
							|  |  |  |     if etag_exists(self, avatar_filename): | 
					
						
							|  |  |  |         # The file has not changed | 
					
						
							|  |  |  |         http_304(self) | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     avatar_tm = os.path.getmtime(avatar_filename) | 
					
						
							|  |  |  |     last_modified_time = \ | 
					
						
							|  |  |  |         datetime.datetime.fromtimestamp(avatar_tm, datetime.timezone.utc) | 
					
						
							|  |  |  |     last_modified_time_str = \ | 
					
						
							|  |  |  |         last_modified_time.strftime('%a, %d %b %Y %H:%M:%S GMT') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     media_image_type = get_image_mime_type(avatar_file) | 
					
						
							|  |  |  |     media_binary = None | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         with open(avatar_filename, 'rb') as av_file: | 
					
						
							|  |  |  |             media_binary = av_file.read() | 
					
						
							|  |  |  |     except OSError: | 
					
						
							|  |  |  |         print('EX: unable to read avatar ' + avatar_filename) | 
					
						
							|  |  |  |     if media_binary: | 
					
						
							|  |  |  |         set_headers_etag(self, avatar_filename, media_image_type, | 
					
						
							|  |  |  |                          media_binary, None, | 
					
						
							|  |  |  |                          referer_domain, True, | 
					
						
							|  |  |  |                          last_modified_time_str) | 
					
						
							|  |  |  |         write2(self, media_binary) | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |     fitness_performance(getreq_start_time, fitness, | 
					
						
							| 
									
										
										
										
											2024-03-03 12:40:56 +00:00
										 |  |  |                         '_GET', 'show_avatar_or_banner', | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                         debug) | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |     return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def show_cached_avatar(self, referer_domain: str, path: str, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                        base_dir: str, getreq_start_time, | 
					
						
							|  |  |  |                        fitness: {}, debug: bool) -> None: | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |     """Shows an avatar image obtained from the cache
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     media_filename = base_dir + '/cache' + path | 
					
						
							|  |  |  |     if os.path.isfile(media_filename): | 
					
						
							|  |  |  |         if etag_exists(self, media_filename): | 
					
						
							|  |  |  |             # The file has not changed | 
					
						
							|  |  |  |             http_304(self) | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         media_binary = None | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             with open(media_filename, 'rb') as av_file: | 
					
						
							|  |  |  |                 media_binary = av_file.read() | 
					
						
							|  |  |  |         except OSError: | 
					
						
							|  |  |  |             print('EX: unable to read cached avatar ' + media_filename) | 
					
						
							|  |  |  |         if media_binary: | 
					
						
							|  |  |  |             mime_type = media_file_mime_type(media_filename) | 
					
						
							|  |  |  |             set_headers_etag(self, media_filename, | 
					
						
							|  |  |  |                              mime_type, | 
					
						
							|  |  |  |                              media_binary, None, | 
					
						
							|  |  |  |                              referer_domain, | 
					
						
							|  |  |  |                              False, None) | 
					
						
							|  |  |  |             write2(self, media_binary) | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |             fitness_performance(getreq_start_time, fitness, | 
					
						
							| 
									
										
										
										
											2024-03-03 12:40:56 +00:00
										 |  |  |                                 '_GET', 'show_cached_avatar', | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                                 debug) | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |             return | 
					
						
							|  |  |  |     http_404(self, 46) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def show_help_screen_image(self, path: str, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                            base_dir: str, getreq_start_time, | 
					
						
							|  |  |  |                            theme_name: str, domain_full: str, | 
					
						
							|  |  |  |                            fitness: {}, debug: bool) -> None: | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |     """Shows a help screen image
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if not is_image_file(path): | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     media_str = path.split('/helpimages/')[1] | 
					
						
							|  |  |  |     if '/' not in media_str: | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |         if not theme_name: | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |             theme = 'default' | 
					
						
							|  |  |  |         else: | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |             theme = theme_name | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |         icon_filename = media_str | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         theme = media_str.split('/')[0] | 
					
						
							|  |  |  |         icon_filename = media_str.split('/')[1] | 
					
						
							|  |  |  |     media_filename = \ | 
					
						
							|  |  |  |         base_dir + '/theme/' + theme + '/helpimages/' + icon_filename | 
					
						
							|  |  |  |     # if there is no theme-specific help image then use the default one | 
					
						
							|  |  |  |     if not os.path.isfile(media_filename): | 
					
						
							|  |  |  |         media_filename = \ | 
					
						
							|  |  |  |             base_dir + '/theme/default/helpimages/' + icon_filename | 
					
						
							|  |  |  |     if etag_exists(self, media_filename): | 
					
						
							|  |  |  |         # The file has not changed | 
					
						
							|  |  |  |         http_304(self) | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     if os.path.isfile(media_filename): | 
					
						
							|  |  |  |         media_binary = None | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             with open(media_filename, 'rb') as av_file: | 
					
						
							|  |  |  |                 media_binary = av_file.read() | 
					
						
							|  |  |  |         except OSError: | 
					
						
							|  |  |  |             print('EX: unable to read help image ' + media_filename) | 
					
						
							|  |  |  |         if media_binary: | 
					
						
							|  |  |  |             mime_type = media_file_mime_type(media_filename) | 
					
						
							|  |  |  |             set_headers_etag(self, media_filename, | 
					
						
							|  |  |  |                              mime_type, | 
					
						
							|  |  |  |                              media_binary, None, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                              domain_full, | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |                              False, None) | 
					
						
							|  |  |  |             write2(self, media_binary) | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |         fitness_performance(getreq_start_time, fitness, | 
					
						
							| 
									
										
										
										
											2024-03-03 12:40:56 +00:00
										 |  |  |                             '_GET', 'show_help_screen_image', | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                             debug) | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |         return | 
					
						
							|  |  |  |     http_404(self, 43) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def show_manual_image(self, path: str, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                       base_dir: str, getreq_start_time, | 
					
						
							|  |  |  |                       icons_cache: {}, domain_full: str, | 
					
						
							|  |  |  |                       fitness: {}, debug: bool) -> None: | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |     """Shows an image within the manual
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     image_filename = path.split('/', 1)[1] | 
					
						
							|  |  |  |     if '/' in image_filename: | 
					
						
							|  |  |  |         http_404(self, 41) | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     media_filename = \ | 
					
						
							|  |  |  |         base_dir + '/manual/' + image_filename | 
					
						
							|  |  |  |     if etag_exists(self, media_filename): | 
					
						
							|  |  |  |         # The file has not changed | 
					
						
							|  |  |  |         http_304(self) | 
					
						
							|  |  |  |         return | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |     if icons_cache.get(media_filename): | 
					
						
							|  |  |  |         media_binary = icons_cache[media_filename] | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |         mime_type_str = media_file_mime_type(media_filename) | 
					
						
							|  |  |  |         set_headers_etag(self, media_filename, | 
					
						
							|  |  |  |                          mime_type_str, | 
					
						
							|  |  |  |                          media_binary, None, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                          domain_full, | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |                          False, None) | 
					
						
							|  |  |  |         write2(self, media_binary) | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |         fitness_performance(getreq_start_time, fitness, | 
					
						
							| 
									
										
										
										
											2024-03-03 12:40:56 +00:00
										 |  |  |                             '_GET', 'show_manual_image', | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                             debug) | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |         return | 
					
						
							|  |  |  |     if os.path.isfile(media_filename): | 
					
						
							|  |  |  |         media_binary = None | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             with open(media_filename, 'rb') as av_file: | 
					
						
							|  |  |  |                 media_binary = av_file.read() | 
					
						
							|  |  |  |         except OSError: | 
					
						
							|  |  |  |             print('EX: unable to read manual image ' + | 
					
						
							|  |  |  |                   media_filename) | 
					
						
							|  |  |  |         if media_binary: | 
					
						
							|  |  |  |             mime_type = media_file_mime_type(media_filename) | 
					
						
							|  |  |  |             set_headers_etag(self, media_filename, | 
					
						
							|  |  |  |                              mime_type, | 
					
						
							|  |  |  |                              media_binary, None, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                              domain_full, | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |                              False, None) | 
					
						
							|  |  |  |             write2(self, media_binary) | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |             icons_cache[media_filename] = media_binary | 
					
						
							|  |  |  |         fitness_performance(getreq_start_time, fitness, | 
					
						
							| 
									
										
										
										
											2024-03-03 12:40:56 +00:00
										 |  |  |                             '_GET', 'show_manual_image', | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                             debug) | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |         return | 
					
						
							|  |  |  |     http_404(self, 42) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def show_specification_image(self, path: str, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                              base_dir: str, getreq_start_time, | 
					
						
							|  |  |  |                              icons_cache: {}, domain_full: str, | 
					
						
							|  |  |  |                              fitness: {}, debug: bool) -> None: | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |     """Shows an image within the ActivityPub specification document
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     image_filename = path.split('/', 1)[1] | 
					
						
							|  |  |  |     if '/' in image_filename: | 
					
						
							|  |  |  |         http_404(self, 39) | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     media_filename = \ | 
					
						
							|  |  |  |         base_dir + '/specification/' + image_filename | 
					
						
							|  |  |  |     if etag_exists(self, media_filename): | 
					
						
							|  |  |  |         # The file has not changed | 
					
						
							|  |  |  |         http_304(self) | 
					
						
							|  |  |  |         return | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |     if icons_cache.get(media_filename): | 
					
						
							|  |  |  |         media_binary = icons_cache[media_filename] | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |         mime_type_str = media_file_mime_type(media_filename) | 
					
						
							|  |  |  |         set_headers_etag(self, media_filename, | 
					
						
							|  |  |  |                          mime_type_str, | 
					
						
							|  |  |  |                          media_binary, None, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                          domain_full, | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |                          False, None) | 
					
						
							|  |  |  |         write2(self, media_binary) | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |         fitness_performance(getreq_start_time, fitness, | 
					
						
							| 
									
										
										
										
											2024-03-03 12:40:56 +00:00
										 |  |  |                             '_GET', 'show_specification_image', | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                             debug) | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |         return | 
					
						
							|  |  |  |     if os.path.isfile(media_filename): | 
					
						
							|  |  |  |         media_binary = None | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             with open(media_filename, 'rb') as av_file: | 
					
						
							|  |  |  |                 media_binary = av_file.read() | 
					
						
							|  |  |  |         except OSError: | 
					
						
							|  |  |  |             print('EX: unable to read specification image ' + | 
					
						
							|  |  |  |                   media_filename) | 
					
						
							|  |  |  |         if media_binary: | 
					
						
							|  |  |  |             mime_type = media_file_mime_type(media_filename) | 
					
						
							|  |  |  |             set_headers_etag(self, media_filename, | 
					
						
							|  |  |  |                              mime_type, | 
					
						
							|  |  |  |                              media_binary, None, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                              domain_full, | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |                              False, None) | 
					
						
							|  |  |  |             write2(self, media_binary) | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |             icons_cache[media_filename] = media_binary | 
					
						
							|  |  |  |         fitness_performance(getreq_start_time, fitness, | 
					
						
							| 
									
										
										
										
											2024-03-03 12:40:56 +00:00
										 |  |  |                             '_GET', 'show_specification_image', | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                             debug) | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |         return | 
					
						
							|  |  |  |     http_404(self, 40) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def show_share_image(self, path: str, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                      base_dir: str, getreq_start_time, | 
					
						
							|  |  |  |                      domain_full: str, fitness: {}, | 
					
						
							|  |  |  |                      debug: bool) -> bool: | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |     """Show a shared item image
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if not is_image_file(path): | 
					
						
							|  |  |  |         http_404(self, 101) | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     media_str = path.split('/sharefiles/')[1] | 
					
						
							|  |  |  |     media_filename = base_dir + '/sharefiles/' + media_str | 
					
						
							|  |  |  |     if not os.path.isfile(media_filename): | 
					
						
							|  |  |  |         http_404(self, 102) | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if etag_exists(self, media_filename): | 
					
						
							|  |  |  |         # The file has not changed | 
					
						
							|  |  |  |         http_304(self) | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     media_file_type = get_image_mime_type(media_filename) | 
					
						
							|  |  |  |     media_binary = None | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         with open(media_filename, 'rb') as av_file: | 
					
						
							|  |  |  |             media_binary = av_file.read() | 
					
						
							|  |  |  |     except OSError: | 
					
						
							|  |  |  |         print('EX: unable to read binary ' + media_filename) | 
					
						
							|  |  |  |     if media_binary: | 
					
						
							|  |  |  |         set_headers_etag(self, media_filename, | 
					
						
							|  |  |  |                          media_file_type, | 
					
						
							|  |  |  |                          media_binary, None, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                          domain_full, | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |                          False, None) | 
					
						
							|  |  |  |         write2(self, media_binary) | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |     fitness_performance(getreq_start_time, fitness, | 
					
						
							| 
									
										
										
										
											2024-03-03 12:40:56 +00:00
										 |  |  |                         '_GET', 'show_share_image', | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                         debug) | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |     return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def show_icon(self, path: str, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |               base_dir: str, getreq_start_time, | 
					
						
							|  |  |  |               theme_name: str, | 
					
						
							|  |  |  |               icons_cache: {}, domain_full: str, | 
					
						
							|  |  |  |               fitness: {}, debug: bool) -> None: | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |     """Shows an icon
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if not path.endswith('.png'): | 
					
						
							|  |  |  |         http_404(self, 37) | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     media_str = path.split('/icons/')[1] | 
					
						
							|  |  |  |     if '/' not in media_str: | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |         if not theme_name: | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |             theme = 'default' | 
					
						
							|  |  |  |         else: | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |             theme = theme_name | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |         icon_filename = media_str | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         theme = media_str.split('/')[0] | 
					
						
							|  |  |  |         icon_filename = media_str.split('/')[1] | 
					
						
							|  |  |  |     media_filename = \ | 
					
						
							|  |  |  |         base_dir + '/theme/' + theme + '/icons/' + icon_filename | 
					
						
							|  |  |  |     if etag_exists(self, media_filename): | 
					
						
							|  |  |  |         # The file has not changed | 
					
						
							|  |  |  |         http_304(self) | 
					
						
							|  |  |  |         return | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |     if icons_cache.get(media_str): | 
					
						
							|  |  |  |         media_binary = icons_cache[media_str] | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |         mime_type_str = media_file_mime_type(media_filename) | 
					
						
							|  |  |  |         set_headers_etag(self, media_filename, | 
					
						
							|  |  |  |                          mime_type_str, | 
					
						
							|  |  |  |                          media_binary, None, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                          domain_full, | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |                          False, None) | 
					
						
							|  |  |  |         write2(self, media_binary) | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |         fitness_performance(getreq_start_time, fitness, | 
					
						
							|  |  |  |                             '_GET', 'show_icon', debug) | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |         return | 
					
						
							|  |  |  |     if os.path.isfile(media_filename): | 
					
						
							|  |  |  |         media_binary = None | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             with open(media_filename, 'rb') as av_file: | 
					
						
							|  |  |  |                 media_binary = av_file.read() | 
					
						
							|  |  |  |         except OSError: | 
					
						
							|  |  |  |             print('EX: unable to read icon image ' + media_filename) | 
					
						
							|  |  |  |         if media_binary: | 
					
						
							|  |  |  |             mime_type = media_file_mime_type(media_filename) | 
					
						
							|  |  |  |             set_headers_etag(self, media_filename, | 
					
						
							|  |  |  |                              mime_type, | 
					
						
							|  |  |  |                              media_binary, None, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                              domain_full, | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |                              False, None) | 
					
						
							|  |  |  |             write2(self, media_binary) | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |             icons_cache[media_str] = media_binary | 
					
						
							|  |  |  |         fitness_performance(getreq_start_time, fitness, | 
					
						
							|  |  |  |                             '_GET', 'show_icon', debug) | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |         return | 
					
						
							|  |  |  |     http_404(self, 38) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def show_media(self, path: str, base_dir: str, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                getreq_start_time, fitness: {}, | 
					
						
							|  |  |  |                debug: bool) -> None: | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |     """Returns a media file
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if is_image_file(path) or \ | 
					
						
							|  |  |  |        path_is_video(path) or \ | 
					
						
							|  |  |  |        path_is_transcript(path) or \ | 
					
						
							|  |  |  |        path_is_audio(path): | 
					
						
							|  |  |  |         media_str = path.split('/media/')[1] | 
					
						
							|  |  |  |         media_filename = base_dir + '/media/' + media_str | 
					
						
							|  |  |  |         if os.path.isfile(media_filename): | 
					
						
							|  |  |  |             if etag_exists(self, media_filename): | 
					
						
							|  |  |  |                 # The file has not changed | 
					
						
							|  |  |  |                 http_304(self) | 
					
						
							|  |  |  |                 return | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             media_file_type = media_file_mime_type(media_filename) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             media_tm = os.path.getmtime(media_filename) | 
					
						
							|  |  |  |             last_modified_time = \ | 
					
						
							|  |  |  |                 datetime.datetime.fromtimestamp(media_tm, | 
					
						
							|  |  |  |                                                 datetime.timezone.utc) | 
					
						
							|  |  |  |             last_modified_time_str = \ | 
					
						
							|  |  |  |                 last_modified_time.strftime('%a, %d %b %Y %H:%M:%S GMT') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if media_filename.endswith('.vtt'): | 
					
						
							|  |  |  |                 media_transcript = None | 
					
						
							|  |  |  |                 try: | 
					
						
							|  |  |  |                     with open(media_filename, 'r', | 
					
						
							|  |  |  |                               encoding='utf-8') as fp_vtt: | 
					
						
							|  |  |  |                         media_transcript = fp_vtt.read() | 
					
						
							|  |  |  |                         media_file_type = 'text/vtt; charset=utf-8' | 
					
						
							|  |  |  |                 except OSError: | 
					
						
							|  |  |  |                     print('EX: unable to read media binary ' + | 
					
						
							|  |  |  |                           media_filename) | 
					
						
							|  |  |  |                 if media_transcript: | 
					
						
							|  |  |  |                     media_transcript = media_transcript.encode('utf-8') | 
					
						
							|  |  |  |                     set_headers_etag(self, media_filename, media_file_type, | 
					
						
							|  |  |  |                                      media_transcript, None, | 
					
						
							|  |  |  |                                      None, True, | 
					
						
							|  |  |  |                                      last_modified_time_str) | 
					
						
							|  |  |  |                     write2(self, media_transcript) | 
					
						
							|  |  |  |                     fitness_performance(getreq_start_time, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                                         fitness, | 
					
						
							| 
									
										
										
										
											2024-03-03 12:40:56 +00:00
										 |  |  |                                         '_GET', 'show_media', | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                                         debug) | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |                     return | 
					
						
							|  |  |  |                 http_404(self, 32) | 
					
						
							|  |  |  |                 return | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             media_binary = None | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 with open(media_filename, 'rb') as av_file: | 
					
						
							|  |  |  |                     media_binary = av_file.read() | 
					
						
							|  |  |  |             except OSError: | 
					
						
							|  |  |  |                 print('EX: unable to read media binary ' + media_filename) | 
					
						
							|  |  |  |             if media_binary: | 
					
						
							|  |  |  |                 set_headers_etag(self, media_filename, media_file_type, | 
					
						
							|  |  |  |                                  media_binary, None, | 
					
						
							|  |  |  |                                  None, True, | 
					
						
							|  |  |  |                                  last_modified_time_str) | 
					
						
							|  |  |  |                 write2(self, media_binary) | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |             fitness_performance(getreq_start_time, fitness, | 
					
						
							|  |  |  |                                 '_GET', 'show_media', debug) | 
					
						
							| 
									
										
										
										
											2024-03-03 10:54:46 +00:00
										 |  |  |             return | 
					
						
							|  |  |  |     http_404(self, 33) | 
					
						
							| 
									
										
										
										
											2024-03-03 11:38:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def show_qrcode(self, calling_domain: str, path: str, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                 base_dir: str, domain: str, domain_full: str, | 
					
						
							| 
									
										
										
										
											2024-03-03 11:38:54 +00:00
										 |  |  |                 onion_domain: str, i2p_domain: str, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                 port: int, getreq_start_time, | 
					
						
							|  |  |  |                 fitness: {}, debug: bool) -> bool: | 
					
						
							| 
									
										
										
										
											2024-03-03 11:38:54 +00:00
										 |  |  |     """Shows a QR code for an account
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     nickname = get_nickname_from_actor(path) | 
					
						
							|  |  |  |     if not nickname: | 
					
						
							|  |  |  |         http_404(self, 93) | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  |     if onion_domain: | 
					
						
							|  |  |  |         qrcode_domain = onion_domain | 
					
						
							|  |  |  |         port = 80 | 
					
						
							|  |  |  |     elif i2p_domain: | 
					
						
							|  |  |  |         qrcode_domain = i2p_domain | 
					
						
							|  |  |  |         port = 80 | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         qrcode_domain = domain | 
					
						
							|  |  |  |     save_person_qrcode(base_dir, nickname, domain, qrcode_domain, port) | 
					
						
							|  |  |  |     qr_filename = \ | 
					
						
							|  |  |  |         acct_dir(base_dir, nickname, domain) + '/qrcode.png' | 
					
						
							|  |  |  |     if os.path.isfile(qr_filename): | 
					
						
							|  |  |  |         if etag_exists(self, qr_filename): | 
					
						
							|  |  |  |             # The file has not changed | 
					
						
							|  |  |  |             http_304(self) | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         tries = 0 | 
					
						
							|  |  |  |         media_binary = None | 
					
						
							|  |  |  |         while tries < 5: | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 with open(qr_filename, 'rb') as av_file: | 
					
						
							|  |  |  |                     media_binary = av_file.read() | 
					
						
							|  |  |  |                     break | 
					
						
							|  |  |  |             except OSError as ex: | 
					
						
							|  |  |  |                 print('EX: _show_qrcode ' + str(tries) + ' ' + str(ex)) | 
					
						
							|  |  |  |                 time.sleep(1) | 
					
						
							|  |  |  |                 tries += 1 | 
					
						
							|  |  |  |         if media_binary: | 
					
						
							|  |  |  |             mime_type = media_file_mime_type(qr_filename) | 
					
						
							|  |  |  |             set_headers_etag(self, qr_filename, mime_type, | 
					
						
							|  |  |  |                              media_binary, None, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                              domain_full, | 
					
						
							| 
									
										
										
										
											2024-03-03 11:38:54 +00:00
										 |  |  |                              False, None) | 
					
						
							|  |  |  |             write2(self, media_binary) | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |             fitness_performance(getreq_start_time, fitness, | 
					
						
							| 
									
										
										
										
											2024-03-03 12:40:56 +00:00
										 |  |  |                                 '_GET', 'show_qrcode', | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                                 debug) | 
					
						
							| 
									
										
										
										
											2024-03-03 11:38:54 +00:00
										 |  |  |             return True | 
					
						
							|  |  |  |     http_404(self, 94) | 
					
						
							|  |  |  |     return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def search_screen_banner(self, path: str, | 
					
						
							|  |  |  |                          base_dir: str, domain: str, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                          getreq_start_time, | 
					
						
							|  |  |  |                          domain_full: str, | 
					
						
							|  |  |  |                          fitness: {}, debug: bool) -> bool: | 
					
						
							| 
									
										
										
										
											2024-03-03 11:38:54 +00:00
										 |  |  |     """Shows a banner image on the search screen
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     nickname = get_nickname_from_actor(path) | 
					
						
							|  |  |  |     if not nickname: | 
					
						
							|  |  |  |         http_404(self, 95) | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  |     banner_filename = \ | 
					
						
							|  |  |  |         acct_dir(base_dir, nickname, domain) + '/search_banner.png' | 
					
						
							|  |  |  |     if not os.path.isfile(banner_filename): | 
					
						
							|  |  |  |         if os.path.isfile(base_dir + '/theme/default/search_banner.png'): | 
					
						
							|  |  |  |             copyfile(base_dir + '/theme/default/search_banner.png', | 
					
						
							|  |  |  |                      banner_filename) | 
					
						
							|  |  |  |     if os.path.isfile(banner_filename): | 
					
						
							|  |  |  |         if etag_exists(self, banner_filename): | 
					
						
							|  |  |  |             # The file has not changed | 
					
						
							|  |  |  |             http_304(self) | 
					
						
							|  |  |  |             return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         tries = 0 | 
					
						
							|  |  |  |         media_binary = None | 
					
						
							|  |  |  |         while tries < 5: | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 with open(banner_filename, 'rb') as av_file: | 
					
						
							|  |  |  |                     media_binary = av_file.read() | 
					
						
							|  |  |  |                     break | 
					
						
							|  |  |  |             except OSError as ex: | 
					
						
							|  |  |  |                 print('EX: _search_screen_banner ' + | 
					
						
							|  |  |  |                       str(tries) + ' ' + str(ex)) | 
					
						
							|  |  |  |                 time.sleep(1) | 
					
						
							|  |  |  |                 tries += 1 | 
					
						
							|  |  |  |         if media_binary: | 
					
						
							|  |  |  |             mime_type = media_file_mime_type(banner_filename) | 
					
						
							|  |  |  |             set_headers_etag(self, banner_filename, mime_type, | 
					
						
							|  |  |  |                              media_binary, None, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                              domain_full, | 
					
						
							| 
									
										
										
										
											2024-03-03 11:38:54 +00:00
										 |  |  |                              False, None) | 
					
						
							|  |  |  |             write2(self, media_binary) | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |             fitness_performance(getreq_start_time, fitness, | 
					
						
							| 
									
										
										
										
											2024-03-03 12:40:56 +00:00
										 |  |  |                                 '_GET', 'search_screen_banner', | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                                 debug) | 
					
						
							| 
									
										
										
										
											2024-03-03 11:38:54 +00:00
										 |  |  |             return True | 
					
						
							|  |  |  |     http_404(self, 96) | 
					
						
							|  |  |  |     return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def column_image(self, side: str, path: str, base_dir: str, domain: str, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                  getreq_start_time, domain_full: str, | 
					
						
							|  |  |  |                  fitness: {}, debug: bool) -> bool: | 
					
						
							| 
									
										
										
										
											2024-03-03 11:38:54 +00:00
										 |  |  |     """Shows an image at the top of the left/right column
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     nickname = get_nickname_from_actor(path) | 
					
						
							|  |  |  |     if not nickname: | 
					
						
							|  |  |  |         http_404(self, 97) | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  |     banner_filename = \ | 
					
						
							|  |  |  |         acct_dir(base_dir, nickname, domain) + '/' + \ | 
					
						
							|  |  |  |         side + '_col_image.png' | 
					
						
							|  |  |  |     if os.path.isfile(banner_filename): | 
					
						
							|  |  |  |         if etag_exists(self, banner_filename): | 
					
						
							|  |  |  |             # The file has not changed | 
					
						
							|  |  |  |             http_304(self) | 
					
						
							|  |  |  |             return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         tries = 0 | 
					
						
							|  |  |  |         media_binary = None | 
					
						
							|  |  |  |         while tries < 5: | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 with open(banner_filename, 'rb') as av_file: | 
					
						
							|  |  |  |                     media_binary = av_file.read() | 
					
						
							|  |  |  |                     break | 
					
						
							|  |  |  |             except OSError as ex: | 
					
						
							|  |  |  |                 print('EX: _column_image ' + str(tries) + ' ' + str(ex)) | 
					
						
							|  |  |  |                 time.sleep(1) | 
					
						
							|  |  |  |                 tries += 1 | 
					
						
							|  |  |  |         if media_binary: | 
					
						
							|  |  |  |             mime_type = media_file_mime_type(banner_filename) | 
					
						
							|  |  |  |             set_headers_etag(self, banner_filename, mime_type, | 
					
						
							|  |  |  |                              media_binary, None, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                              domain_full, | 
					
						
							| 
									
										
										
										
											2024-03-03 11:38:54 +00:00
										 |  |  |                              False, None) | 
					
						
							|  |  |  |             write2(self, media_binary) | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |             fitness_performance(getreq_start_time, fitness, | 
					
						
							| 
									
										
										
										
											2024-03-03 12:40:56 +00:00
										 |  |  |                                 '_GET', 'column_image ' + side, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                                 debug) | 
					
						
							| 
									
										
										
										
											2024-03-03 11:38:54 +00:00
										 |  |  |             return True | 
					
						
							|  |  |  |     http_404(self, 98) | 
					
						
							|  |  |  |     return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def show_default_profile_background(self, base_dir: str, theme_name: str, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                                     getreq_start_time, | 
					
						
							|  |  |  |                                     domain_full: {}, | 
					
						
							|  |  |  |                                     fitness: {}, debug: bool) -> bool: | 
					
						
							| 
									
										
										
										
											2024-03-03 11:38:54 +00:00
										 |  |  |     """If a background image is missing after searching for a handle
 | 
					
						
							|  |  |  |     then substitute this image | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     image_extensions = get_image_extensions() | 
					
						
							|  |  |  |     for ext in image_extensions: | 
					
						
							|  |  |  |         bg_filename = \ | 
					
						
							|  |  |  |             base_dir + '/theme/' + theme_name + '/image.' + ext | 
					
						
							|  |  |  |         if os.path.isfile(bg_filename): | 
					
						
							|  |  |  |             if etag_exists(self, bg_filename): | 
					
						
							|  |  |  |                 # The file has not changed | 
					
						
							|  |  |  |                 http_304(self) | 
					
						
							|  |  |  |                 return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             tries = 0 | 
					
						
							|  |  |  |             bg_binary = None | 
					
						
							|  |  |  |             while tries < 5: | 
					
						
							|  |  |  |                 try: | 
					
						
							|  |  |  |                     with open(bg_filename, 'rb') as av_file: | 
					
						
							|  |  |  |                         bg_binary = av_file.read() | 
					
						
							|  |  |  |                         break | 
					
						
							|  |  |  |                 except OSError as ex: | 
					
						
							|  |  |  |                     print('EX: _show_default_profile_background ' + | 
					
						
							|  |  |  |                           str(tries) + ' ' + str(ex)) | 
					
						
							|  |  |  |                     time.sleep(1) | 
					
						
							|  |  |  |                     tries += 1 | 
					
						
							|  |  |  |             if bg_binary: | 
					
						
							|  |  |  |                 if ext == 'jpg': | 
					
						
							|  |  |  |                     ext = 'jpeg' | 
					
						
							|  |  |  |                 set_headers_etag(self, bg_filename, | 
					
						
							|  |  |  |                                  'image/' + ext, | 
					
						
							|  |  |  |                                  bg_binary, None, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                                  domain_full, | 
					
						
							| 
									
										
										
										
											2024-03-03 11:38:54 +00:00
										 |  |  |                                  False, None) | 
					
						
							|  |  |  |                 write2(self, bg_binary) | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                 fitness_performance(getreq_start_time, fitness, | 
					
						
							| 
									
										
										
										
											2024-03-03 11:38:54 +00:00
										 |  |  |                                     '_GET', | 
					
						
							| 
									
										
										
										
											2024-03-03 12:40:56 +00:00
										 |  |  |                                     'show_default_profile_background', | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                                     debug) | 
					
						
							| 
									
										
										
										
											2024-03-03 11:38:54 +00:00
										 |  |  |                 return True | 
					
						
							|  |  |  |             break | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     http_404(self, 100) | 
					
						
							|  |  |  |     return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def show_background_image(self, path: str, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                           base_dir: str, getreq_start_time, | 
					
						
							|  |  |  |                           domain_full: str, fitness: {}, | 
					
						
							|  |  |  |                           debug: bool) -> bool: | 
					
						
							| 
									
										
										
										
											2024-03-03 11:38:54 +00:00
										 |  |  |     """Show a background image
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     image_extensions = get_image_extensions() | 
					
						
							|  |  |  |     for ext in image_extensions: | 
					
						
							|  |  |  |         for bg_im in ('follow', 'options', 'login', 'welcome'): | 
					
						
							|  |  |  |             # follow screen background image | 
					
						
							|  |  |  |             if path.endswith('/' + bg_im + '-background.' + ext): | 
					
						
							|  |  |  |                 bg_filename = \ | 
					
						
							| 
									
										
										
										
											2024-05-12 12:35:26 +00:00
										 |  |  |                     data_dir(base_dir) + '/' + \ | 
					
						
							| 
									
										
										
										
											2024-03-03 11:38:54 +00:00
										 |  |  |                     bg_im + '-background.' + ext | 
					
						
							|  |  |  |                 if os.path.isfile(bg_filename): | 
					
						
							|  |  |  |                     if etag_exists(self, bg_filename): | 
					
						
							|  |  |  |                         # The file has not changed | 
					
						
							|  |  |  |                         http_304(self) | 
					
						
							|  |  |  |                         return True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     tries = 0 | 
					
						
							|  |  |  |                     bg_binary = None | 
					
						
							|  |  |  |                     while tries < 5: | 
					
						
							|  |  |  |                         try: | 
					
						
							|  |  |  |                             with open(bg_filename, 'rb') as av_file: | 
					
						
							|  |  |  |                                 bg_binary = av_file.read() | 
					
						
							|  |  |  |                                 break | 
					
						
							|  |  |  |                         except OSError as ex: | 
					
						
							|  |  |  |                             print('EX: _show_background_image ' + | 
					
						
							|  |  |  |                                   str(tries) + ' ' + str(ex)) | 
					
						
							|  |  |  |                             time.sleep(1) | 
					
						
							|  |  |  |                             tries += 1 | 
					
						
							|  |  |  |                     if bg_binary: | 
					
						
							|  |  |  |                         if ext == 'jpg': | 
					
						
							|  |  |  |                             ext = 'jpeg' | 
					
						
							|  |  |  |                         set_headers_etag(self, bg_filename, | 
					
						
							|  |  |  |                                          'image/' + ext, | 
					
						
							|  |  |  |                                          bg_binary, None, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                                          domain_full, | 
					
						
							| 
									
										
										
										
											2024-03-03 11:38:54 +00:00
										 |  |  |                                          False, None) | 
					
						
							|  |  |  |                         write2(self, bg_binary) | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                         fitness_performance(getreq_start_time, fitness, | 
					
						
							| 
									
										
										
										
											2024-03-03 11:38:54 +00:00
										 |  |  |                                             '_GET', | 
					
						
							| 
									
										
										
										
											2024-03-03 12:40:56 +00:00
										 |  |  |                                             'show_background_image', | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                                             debug) | 
					
						
							| 
									
										
										
										
											2024-03-03 11:38:54 +00:00
										 |  |  |                         return True | 
					
						
							|  |  |  |     http_404(self, 99) | 
					
						
							|  |  |  |     return True | 
					
						
							| 
									
										
										
										
											2024-03-03 12:40:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def show_emoji(self, path: str, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                base_dir: str, getreq_start_time, | 
					
						
							|  |  |  |                domain_full: {}, fitness: {}, | 
					
						
							|  |  |  |                debug: bool) -> None: | 
					
						
							| 
									
										
										
										
											2024-03-03 12:40:56 +00:00
										 |  |  |     """Returns an emoji image
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if is_image_file(path): | 
					
						
							|  |  |  |         emoji_str = path.split('/emoji/')[1] | 
					
						
							|  |  |  |         emoji_filename = base_dir + '/emoji/' + emoji_str | 
					
						
							|  |  |  |         if not os.path.isfile(emoji_filename): | 
					
						
							|  |  |  |             emoji_filename = base_dir + '/emojicustom/' + emoji_str | 
					
						
							|  |  |  |         if os.path.isfile(emoji_filename): | 
					
						
							|  |  |  |             if etag_exists(self, emoji_filename): | 
					
						
							|  |  |  |                 # The file has not changed | 
					
						
							|  |  |  |                 http_304(self) | 
					
						
							|  |  |  |                 return | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             media_image_type = get_image_mime_type(emoji_filename) | 
					
						
							|  |  |  |             media_binary = None | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 with open(emoji_filename, 'rb') as av_file: | 
					
						
							|  |  |  |                     media_binary = av_file.read() | 
					
						
							|  |  |  |             except OSError: | 
					
						
							|  |  |  |                 print('EX: unable to read emoji image ' + emoji_filename) | 
					
						
							|  |  |  |             if media_binary: | 
					
						
							|  |  |  |                 set_headers_etag(self, emoji_filename, | 
					
						
							|  |  |  |                                  media_image_type, | 
					
						
							|  |  |  |                                  media_binary, None, | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |                                  domain_full, | 
					
						
							| 
									
										
										
										
											2024-03-03 12:40:56 +00:00
										 |  |  |                                  False, None) | 
					
						
							|  |  |  |                 write2(self, media_binary) | 
					
						
							| 
									
										
										
										
											2024-04-10 15:00:42 +00:00
										 |  |  |             fitness_performance(getreq_start_time, fitness, | 
					
						
							|  |  |  |                                 '_GET', 'show_emoji', debug) | 
					
						
							| 
									
										
										
										
											2024-03-03 12:40:56 +00:00
										 |  |  |             return | 
					
						
							|  |  |  |     http_404(self, 36) |