| 
									
										
										
										
											2023-09-29 14:54:38 +00:00
										 |  |  | __filename__ = "pwa.py" | 
					
						
							|  |  |  | __author__ = "Bob Mottram" | 
					
						
							|  |  |  | __license__ = "AGPL3+" | 
					
						
							| 
									
										
										
										
											2024-12-22 23:37:30 +00:00
										 |  |  | __version__ = "1.6.0" | 
					
						
							| 
									
										
										
										
											2023-09-29 14:54:38 +00:00
										 |  |  | __maintainer__ = "Bob Mottram" | 
					
						
							|  |  |  | __email__ = "bob@libreserver.org" | 
					
						
							|  |  |  | __status__ = "Production" | 
					
						
							|  |  |  | __module_group__ = "Web Interface" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | from utils import remove_html | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def _get_variable_from_css(css_str: str, variable: str) -> str: | 
					
						
							|  |  |  |     """Gets a variable value from the css file text
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if '--' + variable + ':' not in css_str: | 
					
						
							|  |  |  |         return None | 
					
						
							|  |  |  |     value = css_str.split('--' + variable + ':')[1] | 
					
						
							|  |  |  |     if ';' in value: | 
					
						
							|  |  |  |         value = value.split(';')[0].strip() | 
					
						
							|  |  |  |     value = remove_html(value) | 
					
						
							|  |  |  |     if ' ' in value: | 
					
						
							|  |  |  |         value = None | 
					
						
							|  |  |  |     return value | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def get_pwa_theme_colors(css_filename: str) -> (str, str): | 
					
						
							|  |  |  |     """Gets the theme/statusbar color for progressive web apps
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     default_pwa_theme_color = 'apple-mobile-web-app-status-bar-style' | 
					
						
							|  |  |  |     pwa_theme_color = default_pwa_theme_color | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     default_pwa_theme_background_color = 'black-translucent' | 
					
						
							|  |  |  |     pwa_theme_background_color = default_pwa_theme_background_color | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if not os.path.isfile(css_filename): | 
					
						
							|  |  |  |         return pwa_theme_color, pwa_theme_background_color | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     css_str = '' | 
					
						
							| 
									
										
										
										
											2024-07-13 20:27:19 +00:00
										 |  |  |     try: | 
					
						
							|  |  |  |         with open(css_filename, 'r', encoding='utf-8') as fp_css: | 
					
						
							|  |  |  |             css_str = fp_css.read() | 
					
						
							|  |  |  |     except OSError: | 
					
						
							|  |  |  |         print('EX: get_pwa_theme_colors unable to read ' + css_filename) | 
					
						
							| 
									
										
										
										
											2023-09-29 14:54:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     pwa_theme_color = \ | 
					
						
							|  |  |  |         _get_variable_from_css(css_str, 'pwa-theme-color') | 
					
						
							|  |  |  |     if not pwa_theme_color: | 
					
						
							|  |  |  |         pwa_theme_color = default_pwa_theme_color | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pwa_theme_background_color = \ | 
					
						
							|  |  |  |         _get_variable_from_css(css_str, 'pwa-theme-background-color') | 
					
						
							|  |  |  |     if not pwa_theme_background_color: | 
					
						
							|  |  |  |         pwa_theme_background_color = default_pwa_theme_background_color | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return pwa_theme_color, pwa_theme_background_color | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def pwa_manifest(base_dir: str) -> {}: | 
					
						
							|  |  |  |     """Returns progressive web app manifest
 | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     css_filename = base_dir + '/epicyon.css' | 
					
						
							|  |  |  |     pwa_theme_color, pwa_theme_background_color = \ | 
					
						
							|  |  |  |         get_pwa_theme_colors(css_filename) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     app1 = "https://f-droid.org/en/packages/eu.siacs.conversations" | 
					
						
							|  |  |  |     app2 = "https://staging.f-droid.org/en/packages/im.vector.app" | 
					
						
							|  |  |  |     app3 = \ | 
					
						
							|  |  |  |         "https://f-droid.org/en/packages/" + \ | 
					
						
							|  |  |  |         "com.stoutner.privacybrowser.standard" | 
					
						
							|  |  |  |     return { | 
					
						
							|  |  |  |         "name": "Epicyon", | 
					
						
							|  |  |  |         "short_name": "Epicyon", | 
					
						
							|  |  |  |         "start_url": "/index.html", | 
					
						
							|  |  |  |         "display": "standalone", | 
					
						
							|  |  |  |         "background_color": pwa_theme_background_color, | 
					
						
							|  |  |  |         "theme_color": pwa_theme_color, | 
					
						
							|  |  |  |         "orientation": "portrait-primary", | 
					
						
							|  |  |  |         "categories": ["microblog", "fediverse", "activitypub"], | 
					
						
							|  |  |  |         "screenshots": [ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "src": "/mobile.jpg", | 
					
						
							|  |  |  |                 "sizes": "418x851", | 
					
						
							|  |  |  |                 "type": "image/jpeg" | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "src": "/mobile_person.jpg", | 
					
						
							|  |  |  |                 "sizes": "429x860", | 
					
						
							|  |  |  |                 "type": "image/jpeg" | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "src": "/mobile_search.jpg", | 
					
						
							|  |  |  |                 "sizes": "422x861", | 
					
						
							|  |  |  |                 "type": "image/jpeg" | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         "icons": [ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "src": "/logo72.png", | 
					
						
							|  |  |  |                 "type": "image/png", | 
					
						
							|  |  |  |                 "sizes": "72x72" | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "src": "/logo96.png", | 
					
						
							|  |  |  |                 "type": "image/png", | 
					
						
							|  |  |  |                 "sizes": "96x96" | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "src": "/logo128.png", | 
					
						
							|  |  |  |                 "type": "image/png", | 
					
						
							|  |  |  |                 "sizes": "128x128" | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "src": "/logo144.png", | 
					
						
							|  |  |  |                 "type": "image/png", | 
					
						
							|  |  |  |                 "sizes": "144x144" | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "src": "/logo150.png", | 
					
						
							|  |  |  |                 "type": "image/png", | 
					
						
							|  |  |  |                 "sizes": "150x150" | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "src": "/apple-touch-icon.png", | 
					
						
							|  |  |  |                 "type": "image/png", | 
					
						
							|  |  |  |                 "sizes": "180x180" | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "src": "/logo192.png", | 
					
						
							|  |  |  |                 "type": "image/png", | 
					
						
							|  |  |  |                 "sizes": "192x192" | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "src": "/logo256.png", | 
					
						
							|  |  |  |                 "type": "image/png", | 
					
						
							|  |  |  |                 "sizes": "256x256" | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "src": "/logo512.png", | 
					
						
							|  |  |  |                 "type": "image/png", | 
					
						
							|  |  |  |                 "sizes": "512x512" | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         "related_applications": [ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "platform": "fdroid", | 
					
						
							|  |  |  |                 "url": app1 | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "platform": "fdroid", | 
					
						
							|  |  |  |                 "url": app2 | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "platform": "fdroid", | 
					
						
							|  |  |  |                 "url": app3 | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         "protocol_handlers": [ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "protocol": "web+ap", | 
					
						
							|  |  |  |                 "url": "?target=%s" | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "protocol": "web+epicyon", | 
					
						
							|  |  |  |                 "url": "?target=%s" | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |     } |