mirror of https://gitlab.com/bashrc2/epicyon
daemon favicon functions in their own module
parent
e6ef8d65f5
commit
cc2f23a095
144
daemon_get.py
144
daemon_get.py
|
@ -178,7 +178,6 @@ from utils import get_image_mime_type
|
||||||
from utils import get_image_extensions
|
from utils import get_image_extensions
|
||||||
from utils import is_account_dir
|
from utils import is_account_dir
|
||||||
from utils import get_css
|
from utils import get_css
|
||||||
from utils import binary_is_image
|
|
||||||
from utils import get_config_param
|
from utils import get_config_param
|
||||||
from utils import user_agent_domain
|
from utils import user_agent_domain
|
||||||
from utils import local_network_host
|
from utils import local_network_host
|
||||||
|
@ -223,6 +222,8 @@ from posts import is_moderator
|
||||||
from posts import get_pinned_post_as_json
|
from posts import get_pinned_post_as_json
|
||||||
from posts import outbox_message_create_wrap
|
from posts import outbox_message_create_wrap
|
||||||
from daemon_get_masto_api import masto_api
|
from daemon_get_masto_api import masto_api
|
||||||
|
from daemon_get_favicon import show_cached_favicon
|
||||||
|
from daemon_get_favicon import get_favicon
|
||||||
|
|
||||||
# Blogs can be longer, so don't show many per page
|
# Blogs can be longer, so don't show many per page
|
||||||
MAX_POSTS_IN_BLOGS_FEED = 4
|
MAX_POSTS_IN_BLOGS_FEED = 4
|
||||||
|
@ -538,14 +539,14 @@ def daemon_http_get(self) -> None:
|
||||||
# have no favicon
|
# have no favicon
|
||||||
if not self.path.startswith('/favicons/'):
|
if not self.path.startswith('/favicons/'):
|
||||||
if 'newswire_favicon.ico' in self.path:
|
if 'newswire_favicon.ico' in self.path:
|
||||||
_get_favicon(self, calling_domain, self.server.base_dir,
|
get_favicon(self, calling_domain, self.server.base_dir,
|
||||||
self.server.debug,
|
self.server.debug,
|
||||||
'newswire_favicon.ico')
|
'newswire_favicon.ico')
|
||||||
return
|
return
|
||||||
|
|
||||||
# favicon image
|
# favicon image
|
||||||
if 'favicon.ico' in self.path:
|
if 'favicon.ico' in self.path:
|
||||||
_get_favicon(self, calling_domain, self.server.base_dir,
|
get_favicon(self, calling_domain, self.server.base_dir,
|
||||||
self.server.debug, 'favicon.ico')
|
self.server.debug, 'favicon.ico')
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -1279,10 +1280,10 @@ def daemon_http_get(self) -> None:
|
||||||
if self.path.startswith('/favicons/'):
|
if self.path.startswith('/favicons/'):
|
||||||
if self.server.domain_full in self.path:
|
if self.server.domain_full in self.path:
|
||||||
# favicon for this instance
|
# favicon for this instance
|
||||||
_get_favicon(self, calling_domain, self.server.base_dir,
|
get_favicon(self, calling_domain, self.server.base_dir,
|
||||||
self.server.debug, 'favicon.ico')
|
self.server.debug, 'favicon.ico')
|
||||||
return
|
return
|
||||||
_show_cached_favicon(self, referer_domain, self.path,
|
show_cached_favicon(self, referer_domain, self.path,
|
||||||
self.server.base_dir,
|
self.server.base_dir,
|
||||||
getreq_start_time)
|
getreq_start_time)
|
||||||
return
|
return
|
||||||
|
@ -4753,87 +4754,6 @@ def _browser_config(self, calling_domain: str, referer_domain: str,
|
||||||
self.server.debug)
|
self.server.debug)
|
||||||
|
|
||||||
|
|
||||||
def _get_favicon(self, calling_domain: str,
|
|
||||||
base_dir: str, debug: bool,
|
|
||||||
fav_filename: str) -> None:
|
|
||||||
"""Return the site favicon or default newswire favicon
|
|
||||||
"""
|
|
||||||
fav_type = 'image/x-icon'
|
|
||||||
if has_accept(self, calling_domain):
|
|
||||||
if 'image/webp' in self.headers['Accept']:
|
|
||||||
fav_type = 'image/webp'
|
|
||||||
fav_filename = fav_filename.split('.')[0] + '.webp'
|
|
||||||
if 'image/avif' in self.headers['Accept']:
|
|
||||||
fav_type = 'image/avif'
|
|
||||||
fav_filename = fav_filename.split('.')[0] + '.avif'
|
|
||||||
if 'image/heic' in self.headers['Accept']:
|
|
||||||
fav_type = 'image/heic'
|
|
||||||
fav_filename = fav_filename.split('.')[0] + '.heic'
|
|
||||||
if 'image/jxl' in self.headers['Accept']:
|
|
||||||
fav_type = 'image/jxl'
|
|
||||||
fav_filename = fav_filename.split('.')[0] + '.jxl'
|
|
||||||
if not self.server.theme_name:
|
|
||||||
self.theme_name = get_config_param(base_dir, 'theme')
|
|
||||||
if not self.server.theme_name:
|
|
||||||
self.server.theme_name = 'default'
|
|
||||||
# custom favicon
|
|
||||||
favicon_filename = \
|
|
||||||
base_dir + '/theme/' + self.server.theme_name + \
|
|
||||||
'/icons/' + fav_filename
|
|
||||||
if not fav_filename.endswith('.ico'):
|
|
||||||
if not os.path.isfile(favicon_filename):
|
|
||||||
if fav_filename.endswith('.webp'):
|
|
||||||
fav_filename = fav_filename.replace('.webp', '.ico')
|
|
||||||
elif fav_filename.endswith('.avif'):
|
|
||||||
fav_filename = fav_filename.replace('.avif', '.ico')
|
|
||||||
elif fav_filename.endswith('.heic'):
|
|
||||||
fav_filename = fav_filename.replace('.heic', '.ico')
|
|
||||||
elif fav_filename.endswith('.jxl'):
|
|
||||||
fav_filename = fav_filename.replace('.jxl', '.ico')
|
|
||||||
if not os.path.isfile(favicon_filename):
|
|
||||||
# default favicon
|
|
||||||
favicon_filename = \
|
|
||||||
base_dir + '/theme/default/icons/' + fav_filename
|
|
||||||
if etag_exists(self, favicon_filename):
|
|
||||||
# The file has not changed
|
|
||||||
if debug:
|
|
||||||
print('favicon icon has not changed: ' + calling_domain)
|
|
||||||
http_304(self)
|
|
||||||
return
|
|
||||||
if self.server.iconsCache.get(fav_filename):
|
|
||||||
fav_binary = self.server.iconsCache[fav_filename]
|
|
||||||
set_headers_etag(self, favicon_filename,
|
|
||||||
fav_type,
|
|
||||||
fav_binary, None,
|
|
||||||
self.server.domain_full,
|
|
||||||
False, None)
|
|
||||||
write2(self, fav_binary)
|
|
||||||
if debug:
|
|
||||||
print('Sent favicon from cache: ' + calling_domain)
|
|
||||||
return
|
|
||||||
if os.path.isfile(favicon_filename):
|
|
||||||
fav_binary = None
|
|
||||||
try:
|
|
||||||
with open(favicon_filename, 'rb') as fav_file:
|
|
||||||
fav_binary = fav_file.read()
|
|
||||||
except OSError:
|
|
||||||
print('EX: unable to read favicon ' + favicon_filename)
|
|
||||||
if fav_binary:
|
|
||||||
set_headers_etag(self, favicon_filename,
|
|
||||||
fav_type,
|
|
||||||
fav_binary, None,
|
|
||||||
self.server.domain_full,
|
|
||||||
False, None)
|
|
||||||
write2(self, fav_binary)
|
|
||||||
self.server.iconsCache[fav_filename] = fav_binary
|
|
||||||
if self.server.debug:
|
|
||||||
print('Sent favicon from file: ' + calling_domain)
|
|
||||||
return
|
|
||||||
if debug:
|
|
||||||
print('favicon not sent: ' + calling_domain)
|
|
||||||
http_404(self, 17)
|
|
||||||
|
|
||||||
|
|
||||||
def _show_conversation_thread(self, authorized: bool,
|
def _show_conversation_thread(self, authorized: bool,
|
||||||
calling_domain: str, path: str,
|
calling_domain: str, path: str,
|
||||||
base_dir: str, http_prefix: str,
|
base_dir: str, http_prefix: str,
|
||||||
|
@ -4917,58 +4837,6 @@ def _show_conversation_thread(self, authorized: bool,
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def _show_cached_favicon(self, referer_domain: str, path: str,
|
|
||||||
base_dir: str, getreq_start_time) -> None:
|
|
||||||
"""Shows a favicon image obtained from the cache
|
|
||||||
"""
|
|
||||||
fav_file = path.replace('/favicons/', '')
|
|
||||||
fav_filename = base_dir + urllib.parse.unquote_plus(path)
|
|
||||||
print('showCachedFavicon: ' + fav_filename)
|
|
||||||
if self.server.favicons_cache.get(fav_file):
|
|
||||||
media_binary = self.server.favicons_cache[fav_file]
|
|
||||||
mime_type = media_file_mime_type(fav_filename)
|
|
||||||
set_headers_etag(self, fav_filename,
|
|
||||||
mime_type,
|
|
||||||
media_binary, None,
|
|
||||||
referer_domain,
|
|
||||||
False, None)
|
|
||||||
write2(self, media_binary)
|
|
||||||
fitness_performance(getreq_start_time, self.server.fitness,
|
|
||||||
'_GET', '_show_cached_favicon2',
|
|
||||||
self.server.debug)
|
|
||||||
return
|
|
||||||
if not os.path.isfile(fav_filename):
|
|
||||||
http_404(self, 44)
|
|
||||||
return
|
|
||||||
if etag_exists(self, fav_filename):
|
|
||||||
# The file has not changed
|
|
||||||
http_304(self)
|
|
||||||
return
|
|
||||||
media_binary = None
|
|
||||||
try:
|
|
||||||
with open(fav_filename, 'rb') as av_file:
|
|
||||||
media_binary = av_file.read()
|
|
||||||
except OSError:
|
|
||||||
print('EX: unable to read cached favicon ' + fav_filename)
|
|
||||||
if media_binary:
|
|
||||||
if binary_is_image(fav_filename, media_binary):
|
|
||||||
mime_type = media_file_mime_type(fav_filename)
|
|
||||||
set_headers_etag(self, fav_filename,
|
|
||||||
mime_type,
|
|
||||||
media_binary, None,
|
|
||||||
referer_domain,
|
|
||||||
False, None)
|
|
||||||
write2(self, media_binary)
|
|
||||||
fitness_performance(getreq_start_time, self.server.fitness,
|
|
||||||
'_GET', '_show_cached_favicon',
|
|
||||||
self.server.debug)
|
|
||||||
self.server.favicons_cache[fav_file] = media_binary
|
|
||||||
return
|
|
||||||
else:
|
|
||||||
print('WARN: favicon is not an image ' + fav_filename)
|
|
||||||
http_404(self, 45)
|
|
||||||
|
|
||||||
|
|
||||||
def _get_style_sheet(self, base_dir: str, calling_domain: str, path: str,
|
def _get_style_sheet(self, base_dir: str, calling_domain: str, path: str,
|
||||||
getreq_start_time) -> bool:
|
getreq_start_time) -> bool:
|
||||||
"""Returns the content of a css file
|
"""Returns the content of a css file
|
||||||
|
|
|
@ -0,0 +1,154 @@
|
||||||
|
__filename__ = "daemon_get_favicon.py"
|
||||||
|
__author__ = "Bob Mottram"
|
||||||
|
__license__ = "AGPL3+"
|
||||||
|
__version__ = "1.5.0"
|
||||||
|
__maintainer__ = "Bob Mottram"
|
||||||
|
__email__ = "bob@libreserver.org"
|
||||||
|
__status__ = "Production"
|
||||||
|
__module_group__ = "Core"
|
||||||
|
|
||||||
|
import os
|
||||||
|
import urllib.parse
|
||||||
|
from fitnessFunctions import fitness_performance
|
||||||
|
from httpheaders import set_headers_etag
|
||||||
|
from httpcodes import write2
|
||||||
|
from httpcodes import http_304
|
||||||
|
from httpcodes import http_404
|
||||||
|
from daemon_utils import has_accept
|
||||||
|
from daemon_utils import etag_exists
|
||||||
|
from utils import get_config_param
|
||||||
|
from utils import media_file_mime_type
|
||||||
|
from utils import binary_is_image
|
||||||
|
|
||||||
|
|
||||||
|
def get_favicon(self, calling_domain: str,
|
||||||
|
base_dir: str, debug: bool,
|
||||||
|
fav_filename: str) -> None:
|
||||||
|
"""Return the site favicon or default newswire favicon
|
||||||
|
"""
|
||||||
|
fav_type = 'image/x-icon'
|
||||||
|
if has_accept(self, calling_domain):
|
||||||
|
if 'image/webp' in self.headers['Accept']:
|
||||||
|
fav_type = 'image/webp'
|
||||||
|
fav_filename = fav_filename.split('.')[0] + '.webp'
|
||||||
|
if 'image/avif' in self.headers['Accept']:
|
||||||
|
fav_type = 'image/avif'
|
||||||
|
fav_filename = fav_filename.split('.')[0] + '.avif'
|
||||||
|
if 'image/heic' in self.headers['Accept']:
|
||||||
|
fav_type = 'image/heic'
|
||||||
|
fav_filename = fav_filename.split('.')[0] + '.heic'
|
||||||
|
if 'image/jxl' in self.headers['Accept']:
|
||||||
|
fav_type = 'image/jxl'
|
||||||
|
fav_filename = fav_filename.split('.')[0] + '.jxl'
|
||||||
|
if not self.server.theme_name:
|
||||||
|
self.theme_name = get_config_param(base_dir, 'theme')
|
||||||
|
if not self.server.theme_name:
|
||||||
|
self.server.theme_name = 'default'
|
||||||
|
# custom favicon
|
||||||
|
favicon_filename = \
|
||||||
|
base_dir + '/theme/' + self.server.theme_name + \
|
||||||
|
'/icons/' + fav_filename
|
||||||
|
if not fav_filename.endswith('.ico'):
|
||||||
|
if not os.path.isfile(favicon_filename):
|
||||||
|
if fav_filename.endswith('.webp'):
|
||||||
|
fav_filename = fav_filename.replace('.webp', '.ico')
|
||||||
|
elif fav_filename.endswith('.avif'):
|
||||||
|
fav_filename = fav_filename.replace('.avif', '.ico')
|
||||||
|
elif fav_filename.endswith('.heic'):
|
||||||
|
fav_filename = fav_filename.replace('.heic', '.ico')
|
||||||
|
elif fav_filename.endswith('.jxl'):
|
||||||
|
fav_filename = fav_filename.replace('.jxl', '.ico')
|
||||||
|
if not os.path.isfile(favicon_filename):
|
||||||
|
# default favicon
|
||||||
|
favicon_filename = \
|
||||||
|
base_dir + '/theme/default/icons/' + fav_filename
|
||||||
|
if etag_exists(self, favicon_filename):
|
||||||
|
# The file has not changed
|
||||||
|
if debug:
|
||||||
|
print('favicon icon has not changed: ' + calling_domain)
|
||||||
|
http_304(self)
|
||||||
|
return
|
||||||
|
if self.server.iconsCache.get(fav_filename):
|
||||||
|
fav_binary = self.server.iconsCache[fav_filename]
|
||||||
|
set_headers_etag(self, favicon_filename,
|
||||||
|
fav_type,
|
||||||
|
fav_binary, None,
|
||||||
|
self.server.domain_full,
|
||||||
|
False, None)
|
||||||
|
write2(self, fav_binary)
|
||||||
|
if debug:
|
||||||
|
print('Sent favicon from cache: ' + calling_domain)
|
||||||
|
return
|
||||||
|
if os.path.isfile(favicon_filename):
|
||||||
|
fav_binary = None
|
||||||
|
try:
|
||||||
|
with open(favicon_filename, 'rb') as fav_file:
|
||||||
|
fav_binary = fav_file.read()
|
||||||
|
except OSError:
|
||||||
|
print('EX: unable to read favicon ' + favicon_filename)
|
||||||
|
if fav_binary:
|
||||||
|
set_headers_etag(self, favicon_filename,
|
||||||
|
fav_type,
|
||||||
|
fav_binary, None,
|
||||||
|
self.server.domain_full,
|
||||||
|
False, None)
|
||||||
|
write2(self, fav_binary)
|
||||||
|
self.server.iconsCache[fav_filename] = fav_binary
|
||||||
|
if self.server.debug:
|
||||||
|
print('Sent favicon from file: ' + calling_domain)
|
||||||
|
return
|
||||||
|
if debug:
|
||||||
|
print('favicon not sent: ' + calling_domain)
|
||||||
|
http_404(self, 17)
|
||||||
|
|
||||||
|
|
||||||
|
def show_cached_favicon(self, referer_domain: str, path: str,
|
||||||
|
base_dir: str, getreq_start_time) -> None:
|
||||||
|
"""Shows a favicon image obtained from the cache
|
||||||
|
"""
|
||||||
|
fav_file = path.replace('/favicons/', '')
|
||||||
|
fav_filename = base_dir + urllib.parse.unquote_plus(path)
|
||||||
|
print('showCachedFavicon: ' + fav_filename)
|
||||||
|
if self.server.favicons_cache.get(fav_file):
|
||||||
|
media_binary = self.server.favicons_cache[fav_file]
|
||||||
|
mime_type = media_file_mime_type(fav_filename)
|
||||||
|
set_headers_etag(self, fav_filename,
|
||||||
|
mime_type,
|
||||||
|
media_binary, None,
|
||||||
|
referer_domain,
|
||||||
|
False, None)
|
||||||
|
write2(self, media_binary)
|
||||||
|
fitness_performance(getreq_start_time, self.server.fitness,
|
||||||
|
'_GET', '_show_cached_favicon2',
|
||||||
|
self.server.debug)
|
||||||
|
return
|
||||||
|
if not os.path.isfile(fav_filename):
|
||||||
|
http_404(self, 44)
|
||||||
|
return
|
||||||
|
if etag_exists(self, fav_filename):
|
||||||
|
# The file has not changed
|
||||||
|
http_304(self)
|
||||||
|
return
|
||||||
|
media_binary = None
|
||||||
|
try:
|
||||||
|
with open(fav_filename, 'rb') as av_file:
|
||||||
|
media_binary = av_file.read()
|
||||||
|
except OSError:
|
||||||
|
print('EX: unable to read cached favicon ' + fav_filename)
|
||||||
|
if media_binary:
|
||||||
|
if binary_is_image(fav_filename, media_binary):
|
||||||
|
mime_type = media_file_mime_type(fav_filename)
|
||||||
|
set_headers_etag(self, fav_filename,
|
||||||
|
mime_type,
|
||||||
|
media_binary, None,
|
||||||
|
referer_domain,
|
||||||
|
False, None)
|
||||||
|
write2(self, media_binary)
|
||||||
|
fitness_performance(getreq_start_time, self.server.fitness,
|
||||||
|
'_GET', '_show_cached_favicon',
|
||||||
|
self.server.debug)
|
||||||
|
self.server.favicons_cache[fav_file] = media_binary
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
print('WARN: favicon is not an image ' + fav_filename)
|
||||||
|
http_404(self, 45)
|
Loading…
Reference in New Issue