mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-04-10 13:02:59 +00:00
hopefully fix of the day settings
This commit is contained in:
@@ -39,17 +39,35 @@ class OfTheDayManager:
|
|||||||
|
|
||||||
# Load fonts with robust path resolution and fallbacks
|
# Load fonts with robust path resolution and fallbacks
|
||||||
try:
|
try:
|
||||||
|
# Try multiple font directory locations
|
||||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||||
font_dir = os.path.abspath(os.path.join(script_dir, '..', 'assets', 'fonts'))
|
possible_font_dirs = [
|
||||||
|
os.path.abspath(os.path.join(script_dir, '..', 'assets', 'fonts')), # Relative to src/
|
||||||
|
os.path.abspath(os.path.join(os.getcwd(), 'assets', 'fonts')), # Relative to project root
|
||||||
|
'assets/fonts' # Simple relative path
|
||||||
|
]
|
||||||
|
|
||||||
|
font_dir = None
|
||||||
|
for potential_dir in possible_font_dirs:
|
||||||
|
if os.path.exists(potential_dir):
|
||||||
|
font_dir = potential_dir
|
||||||
|
logger.debug(f"Found font directory at: {font_dir}")
|
||||||
|
break
|
||||||
|
|
||||||
|
if font_dir is None:
|
||||||
|
logger.warning("No font directory found, using fallback fonts")
|
||||||
|
raise FileNotFoundError("Font directory not found")
|
||||||
|
|
||||||
def _safe_load_bdf_font(filename):
|
def _safe_load_bdf_font(filename):
|
||||||
try:
|
try:
|
||||||
font_path = os.path.abspath(os.path.join(font_dir, filename))
|
font_path = os.path.abspath(os.path.join(font_dir, filename))
|
||||||
if not os.path.exists(font_path):
|
if not os.path.exists(font_path):
|
||||||
raise FileNotFoundError(f"Font file not found: {font_path}")
|
logger.debug(f"Font file not found: {font_path}")
|
||||||
|
return None
|
||||||
|
logger.debug(f"Loading BDF font: {font_path}")
|
||||||
return freetype.Face(font_path)
|
return freetype.Face(font_path)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Failed to load BDF font '{filename}': {e}")
|
logger.debug(f"Failed to load BDF font '{filename}': {e}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
self.title_font = _safe_load_bdf_font('ic8x8u.bdf')
|
self.title_font = _safe_load_bdf_font('ic8x8u.bdf')
|
||||||
@@ -58,19 +76,19 @@ class OfTheDayManager:
|
|||||||
# Fallbacks if BDF fonts aren't available
|
# Fallbacks if BDF fonts aren't available
|
||||||
if self.title_font is None:
|
if self.title_font is None:
|
||||||
self.title_font = getattr(self.display_manager, 'bdf_5x7_font', None) or getattr(self.display_manager, 'small_font', ImageFont.load_default())
|
self.title_font = getattr(self.display_manager, 'bdf_5x7_font', None) or getattr(self.display_manager, 'small_font', ImageFont.load_default())
|
||||||
logger.warning("Using fallback font for title in OfTheDayManager")
|
logger.info("Using fallback font for title in OfTheDayManager")
|
||||||
if self.body_font is None:
|
if self.body_font is None:
|
||||||
self.body_font = getattr(self.display_manager, 'bdf_5x7_font', None) or getattr(self.display_manager, 'small_font', ImageFont.load_default())
|
self.body_font = getattr(self.display_manager, 'bdf_5x7_font', None) or getattr(self.display_manager, 'small_font', ImageFont.load_default())
|
||||||
logger.warning("Using fallback font for body in OfTheDayManager")
|
logger.info("Using fallback font for body in OfTheDayManager")
|
||||||
|
|
||||||
# Log font types for debugging
|
# Log font types for debugging
|
||||||
logger.debug(f"Title font type: {type(self.title_font).__name__}")
|
logger.debug(f"Title font type: {type(self.title_font).__name__}")
|
||||||
logger.debug(f"Body font type: {type(self.body_font).__name__}")
|
logger.debug(f"Body font type: {type(self.body_font).__name__}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Unexpected error during font initialization: {e}")
|
logger.warning(f"Error during font initialization, using fallbacks: {e}")
|
||||||
# Last-resort fallback
|
# Last-resort fallback
|
||||||
self.title_font = ImageFont.load_default()
|
self.title_font = getattr(self.display_manager, 'small_font', ImageFont.load_default())
|
||||||
self.body_font = ImageFont.load_default()
|
self.body_font = getattr(self.display_manager, 'small_font', ImageFont.load_default())
|
||||||
|
|
||||||
# Load categories and their data
|
# Load categories and their data
|
||||||
self.categories = self.of_the_day_config.get('categories', {})
|
self.categories = self.of_the_day_config.get('categories', {})
|
||||||
@@ -123,17 +141,40 @@ class OfTheDayManager:
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Try relative path first, then absolute
|
# Try multiple possible paths for data files
|
||||||
file_path = data_file
|
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||||
if not os.path.isabs(file_path):
|
possible_paths = []
|
||||||
|
|
||||||
|
if os.path.isabs(data_file):
|
||||||
|
possible_paths.append(data_file)
|
||||||
|
else:
|
||||||
# If data_file already contains 'of_the_day/', use it as is
|
# If data_file already contains 'of_the_day/', use it as is
|
||||||
if data_file.startswith('of_the_day/'):
|
if data_file.startswith('of_the_day/'):
|
||||||
file_path = os.path.join(os.path.dirname(__file__), '..', data_file)
|
possible_paths.extend([
|
||||||
|
os.path.join(script_dir, '..', data_file),
|
||||||
|
os.path.join(os.getcwd(), data_file),
|
||||||
|
data_file
|
||||||
|
])
|
||||||
else:
|
else:
|
||||||
file_path = os.path.join(os.path.dirname(__file__), '..', 'of_the_day', data_file)
|
possible_paths.extend([
|
||||||
|
os.path.join(script_dir, '..', 'of_the_day', data_file),
|
||||||
|
os.path.join(os.getcwd(), 'of_the_day', data_file),
|
||||||
|
os.path.join('of_the_day', data_file)
|
||||||
|
])
|
||||||
|
|
||||||
|
file_path = None
|
||||||
|
for potential_path in possible_paths:
|
||||||
|
abs_path = os.path.abspath(potential_path)
|
||||||
|
if os.path.exists(abs_path):
|
||||||
|
file_path = abs_path
|
||||||
|
logger.debug(f"Found data file for {category_name} at: {file_path}")
|
||||||
|
break
|
||||||
|
|
||||||
|
if file_path is None:
|
||||||
|
# Use the first attempted path for error reporting
|
||||||
|
file_path = os.path.abspath(possible_paths[0])
|
||||||
|
logger.debug(f"No data file found for {category_name}, tried: {[os.path.abspath(p) for p in possible_paths]}")
|
||||||
|
|
||||||
# Convert to absolute path for better logging
|
|
||||||
file_path = os.path.abspath(file_path)
|
|
||||||
logger.debug(f"Attempting to load {category_name} from: {file_path}")
|
logger.debug(f"Attempting to load {category_name} from: {file_path}")
|
||||||
|
|
||||||
if os.path.exists(file_path):
|
if os.path.exists(file_path):
|
||||||
@@ -159,7 +200,12 @@ class OfTheDayManager:
|
|||||||
|
|
||||||
else:
|
else:
|
||||||
logger.error(f"Data file not found for {category_name}: {file_path}")
|
logger.error(f"Data file not found for {category_name}: {file_path}")
|
||||||
logger.error(f"Directory contents: {os.listdir(os.path.dirname(file_path)) if os.path.exists(os.path.dirname(file_path)) else 'Parent directory does not exist'}")
|
if os.path.exists(os.path.dirname(file_path)):
|
||||||
|
dir_contents = os.listdir(os.path.dirname(file_path))
|
||||||
|
logger.error(f"Directory contents: {dir_contents}")
|
||||||
|
else:
|
||||||
|
logger.error(f"Parent directory does not exist: {os.path.dirname(file_path)}")
|
||||||
|
logger.error(f"Tried paths: {[os.path.abspath(p) for p in possible_paths]}")
|
||||||
self.data_files[category_name] = {}
|
self.data_files[category_name] = {}
|
||||||
|
|
||||||
except json.JSONDecodeError as e:
|
except json.JSONDecodeError as e:
|
||||||
|
|||||||
@@ -2037,7 +2037,7 @@
|
|||||||
<div id="notification" class="notification"></div>
|
<div id="notification" class="notification"></div>
|
||||||
|
|
||||||
<!-- Server-provided data for JS (avoids inline Jinja in JS) -->
|
<!-- Server-provided data for JS (avoids inline Jinja in JS) -->
|
||||||
<script id="serverData" type="application/json">{{ {'main_config': main_config, 'editor_mode': editor_mode} | tojson }}</script>
|
<script id="serverData" type="application/json">{{ {'main_config': main_config_data, 'editor_mode': editor_mode} | tojson }}</script>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// Global variables
|
// Global variables
|
||||||
@@ -2049,6 +2049,19 @@
|
|||||||
let currentElements = [];
|
let currentElements = [];
|
||||||
let selectedElement = null;
|
let selectedElement = null;
|
||||||
|
|
||||||
|
// Function to refresh the current config from the server
|
||||||
|
async function refreshCurrentConfig() {
|
||||||
|
try {
|
||||||
|
const response = await fetch('/api/config/main');
|
||||||
|
if (response.ok) {
|
||||||
|
const configData = await response.json();
|
||||||
|
currentConfig = configData;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.warn('Failed to refresh current config:', error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function refreshOnDemandStatus(){
|
async function refreshOnDemandStatus(){
|
||||||
try{
|
try{
|
||||||
const res = await fetch('/api/ondemand/status');
|
const res = await fetch('/api/ondemand/status');
|
||||||
@@ -3451,6 +3464,8 @@
|
|||||||
// Sports configuration
|
// Sports configuration
|
||||||
async function refreshSportsConfig(){
|
async function refreshSportsConfig(){
|
||||||
try {
|
try {
|
||||||
|
// Refresh the current config to ensure we have the latest data
|
||||||
|
await refreshCurrentConfig();
|
||||||
const res = await fetch('/api/system/status');
|
const res = await fetch('/api/system/status');
|
||||||
const stats = await res.json();
|
const stats = await res.json();
|
||||||
// Build a minimal sports UI off current config
|
// Build a minimal sports UI off current config
|
||||||
|
|||||||
Reference in New Issue
Block a user