diff --git a/src/scripts/install_offline.sh b/src/scripts/install_offline.sh index abe4e2c..19d8b40 100755 --- a/src/scripts/install_offline.sh +++ b/src/scripts/install_offline.sh @@ -5,7 +5,7 @@ set -e # Exit on any error SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" +PROJECT_ROOT="$(dirname "$(dirname "$SCRIPT_DIR")")" echo "=== Signage Player Offline Installation ===" echo "Project root: $PROJECT_ROOT" @@ -45,10 +45,13 @@ fi echo "Step 2: Creating virtual environment..." cd "$PROJECT_ROOT" if [ ! -d "venv" ]; then - python3 -m venv venv - echo "Virtual environment created." + python3 -m venv --system-site-packages venv + echo "Virtual environment created with system site packages access." else - echo "Virtual environment already exists." + echo "Removing existing virtual environment and creating new one with system site packages..." + rm -rf venv + python3 -m venv --system-site-packages venv + echo "Virtual environment recreated with system site packages access." fi # Activate virtual environment @@ -57,35 +60,38 @@ source venv/bin/activate # Install Python packages from offline wheels echo "Step 4: Installing Python packages from offline wheels..." -if [ -d "src/offline_packages" ]; then +OFFLINE_PACKAGES_DIR="$PROJECT_ROOT/src/offline_packages" +if [ -d "$OFFLINE_PACKAGES_DIR" ]; then pip install --upgrade pip - pip install --no-index --find-links "src/offline_packages" \ + pip install --no-index --find-links "$OFFLINE_PACKAGES_DIR" \ requests pillow pygame certifi charset_normalizer idna urllib3 echo "Python packages installed successfully." else - echo "ERROR: Offline packages directory not found!" + echo "ERROR: Offline packages directory not found at: $OFFLINE_PACKAGES_DIR" exit 1 fi # Copy shared modules to tkinter app echo "Step 5: Setting up shared modules..." -if [ -d "src/shared_modules" ]; then - cp src/shared_modules/*.py tkinter_app/src/ 2>/dev/null || echo "Shared modules already in place." +SHARED_MODULES_DIR="$PROJECT_ROOT/src/shared_modules" +TKINTER_APP_DIR="$PROJECT_ROOT/tkinter_app/src" +if [ -d "$SHARED_MODULES_DIR" ]; then + cp "$SHARED_MODULES_DIR"/*.py "$TKINTER_APP_DIR"/ 2>/dev/null || echo "Shared modules already in place." echo "Shared modules configured." else - echo "Warning: Shared modules directory not found." + echo "Warning: Shared modules directory not found at: $SHARED_MODULES_DIR" fi # Create necessary directories echo "Step 6: Creating application directories..." -mkdir -p tkinter_app/resources/static/resurse -mkdir -p tkinter_app/src/static/resurse +mkdir -p "$PROJECT_ROOT/tkinter_app/resources/static/resurse" +mkdir -p "$PROJECT_ROOT/tkinter_app/src/static/resurse" # Set permissions echo "Step 7: Setting permissions..." -chmod +x run_tkinter_debug.sh -chmod +x install_tkinter.sh -chmod +x src/scripts/*.sh 2>/dev/null || true +chmod +x "$PROJECT_ROOT/run_tkinter_debug.sh" 2>/dev/null || true +chmod +x "$PROJECT_ROOT/install_tkinter.sh" 2>/dev/null || true +chmod +x "$PROJECT_ROOT/src/scripts"/*.sh 2>/dev/null || true echo "" echo "=== Installation Complete! ===" diff --git a/test_centering.py b/test_centering.py new file mode 100644 index 0000000..a4e75fd --- /dev/null +++ b/test_centering.py @@ -0,0 +1,143 @@ +#!/usr/bin/env python3 +""" +Test script to verify window centering functionality +""" +import tkinter as tk +import sys +import os +sys.path.append('tkinter_app/src') +from tkinter_simple_player import SettingsWindow, SimpleMediaPlayerApp + +def test_settings_centering(): + """Test settings window centering""" + root = tk.Tk() + root.withdraw() # Hide main window + + # Create a mock app object + class MockApp: + def __init__(self): + self.playlist = [] + self.current_index = 0 + + def play_current_media(self): + print('play_current_media called') + + app = MockApp() + + # Test settings window centering + try: + print("Testing settings window centering...") + settings = SettingsWindow(root, app) + + # Get screen dimensions + screen_width = settings.window.winfo_screenwidth() + screen_height = settings.window.winfo_screenheight() + + # Get window position + settings.window.update_idletasks() + window_x = settings.window.winfo_x() + window_y = settings.window.winfo_y() + window_width = 900 + window_height = 700 + + # Calculate expected center position + expected_x = (screen_width - window_width) // 2 + expected_y = (screen_height - window_height) // 2 + + print(f"Screen size: {screen_width}x{screen_height}") + print(f"Window position: {window_x}, {window_y}") + print(f"Expected center: {expected_x}, {expected_y}") + print(f"Window size: {window_width}x{window_height}") + + # Check if window is roughly centered (allow some margin for window decorations) + margin = 50 + is_centered_x = abs(window_x - expected_x) <= margin + is_centered_y = abs(window_y - expected_y) <= margin + + if is_centered_x and is_centered_y: + print("โœ… Settings window is properly centered!") + else: + print("โŒ Settings window centering needs adjustment") + + # Keep window open for 3 seconds to visually verify + root.after(3000, root.quit) + root.mainloop() + + except Exception as e: + print(f"โŒ Error testing settings window: {e}") + +def test_exit_dialog_centering(): + """Test exit dialog centering""" + print("\nTesting exit dialog centering...") + + # Create a simple test for the centering function + root = tk.Tk() + root.withdraw() + + # Create a test dialog + dialog = tk.Toplevel(root) + dialog.title("Test Exit Dialog") + dialog.geometry("400x200") + dialog.configure(bg='#2d2d2d') + dialog.resizable(False, False) + + # Test the centering logic + dialog.update_idletasks() + screen_width = dialog.winfo_screenwidth() + screen_height = dialog.winfo_screenheight() + dialog_width = 400 + dialog_height = 200 + + # Calculate center position + center_x = int((screen_width - dialog_width) / 2) + center_y = int((screen_height - dialog_height) / 2) + + # Ensure the dialog doesn't go off-screen + center_x = max(0, min(center_x, screen_width - dialog_width)) + center_y = max(0, min(center_y, screen_height - dialog_height)) + + dialog.geometry(f"{dialog_width}x{dialog_height}+{center_x}+{center_y}") + dialog.lift() + + # Add test content + tk.Label(dialog, text="๐ŸŽฌ Test Exit Dialog", + font=('Arial', 16, 'bold'), + fg='white', bg='#2d2d2d').pack(pady=20) + + tk.Label(dialog, text="This dialog should be centered on screen", + font=('Arial', 12), + fg='white', bg='#2d2d2d').pack(pady=10) + + # Get actual position + dialog.update_idletasks() + actual_x = dialog.winfo_x() + actual_y = dialog.winfo_y() + + print(f"Screen size: {screen_width}x{screen_height}") + print(f"Dialog position: {actual_x}, {actual_y}") + print(f"Expected center: {center_x}, {center_y}") + + # Check centering + margin = 50 + is_centered_x = abs(actual_x - center_x) <= margin + is_centered_y = abs(actual_y - center_y) <= margin + + if is_centered_x and is_centered_y: + print("โœ… Exit dialog is properly centered!") + else: + print("โŒ Exit dialog centering needs adjustment") + + # Close dialog after 3 seconds + root.after(3000, root.quit) + root.mainloop() + +if __name__ == "__main__": + print("๐Ÿงช Testing Window Centering Functionality") + print("=" * 50) + + test_settings_centering() + test_exit_dialog_centering() + + print("\nโœ… Centering tests completed!") + print("\nThe windows should appear centered on your screen regardless of resolution.") + print("This works for any screen size: 1024x768, 1920x1080, 4K, etc.") diff --git a/test_image_display.py b/test_image_display.py new file mode 100644 index 0000000..f221d0f --- /dev/null +++ b/test_image_display.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +""" +Test script to verify image display functionality +""" +import tkinter as tk +from PIL import Image, ImageTk +import os + +def test_image_display(): + # Create a simple tkinter window + root = tk.Tk() + root.title("Image Display Test") + root.geometry("800x600") + root.configure(bg='black') + + # Create image label + image_label = tk.Label(root, bg='black') + image_label.pack(fill=tk.BOTH, expand=True) + + # Test image path + test_image = "/home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg" + + try: + if os.path.exists(test_image): + print(f"Loading image: {test_image}") + + # Load and display image + img = Image.open(test_image) + img.thumbnail((800, 600), Image.LANCZOS) + photo = ImageTk.PhotoImage(img) + + image_label.config(image=photo) + image_label.image = photo # Keep reference + + print(f"Image loaded successfully: {img.size}") + + # Close after 3 seconds + root.after(3000, root.quit) + + else: + print(f"Image file not found: {test_image}") + image_label.config(text="Image file not found", fg='white') + root.after(2000, root.quit) + + except Exception as e: + print(f"Error loading image: {e}") + image_label.config(text=f"Error: {e}", fg='red') + root.after(2000, root.quit) + + root.mainloop() + print("Image display test completed") + +if __name__ == "__main__": + test_image_display() diff --git a/test_imports.py b/test_imports.py new file mode 100644 index 0000000..7986826 --- /dev/null +++ b/test_imports.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +import sys +print("Testing imports...") + +try: + import tkinter as tk + print("โœ“ tkinter imported successfully") +except Exception as e: + print(f"โœ— tkinter import failed: {e}") + +try: + from PIL import Image, ImageTk + print("โœ“ PIL and ImageTk imported successfully") +except Exception as e: + print(f"โœ— PIL import failed: {e}") + +try: + from virtual_keyboard import VirtualKeyboard + print("โœ“ Virtual keyboard imported successfully") +except Exception as e: + print(f"โœ— Virtual keyboard import failed: {e}") + +try: + from python_functions import load_local_playlist + print("โœ“ Python functions imported successfully") + + # Test loading playlist + playlist_data = load_local_playlist() + playlist = playlist_data.get('playlist', []) + print(f"โœ“ Local playlist loaded: {len(playlist)} items") + + for i, item in enumerate(playlist): + print(f" {i+1}. {item.get('file_name', 'Unknown')}") + +except Exception as e: + print(f"โœ— Python functions import/execution failed: {e}") + +print("Import test completed") diff --git a/test_scaling.py b/test_scaling.py new file mode 100644 index 0000000..5d62495 --- /dev/null +++ b/test_scaling.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python3 +""" +Test script for full-screen image scaling functionality +""" +import tkinter as tk +from PIL import Image, ImageTk +import os + +def test_scaling_modes(): + """Test different scaling modes for images""" + + def scale_image_to_screen(img, screen_width, screen_height, mode='fit'): + """Test scaling function""" + img_width, img_height = img.size + + if mode == 'stretch': + return img.resize((screen_width, screen_height), Image.LANCZOS), (0, 0) + + elif mode == 'fill': + screen_ratio = screen_width / screen_height + img_ratio = img_width / img_height + + if img_ratio > screen_ratio: + new_height = screen_height + new_width = int(screen_height * img_ratio) + x_offset = (screen_width - new_width) // 2 + y_offset = 0 + else: + new_width = screen_width + new_height = int(screen_width / img_ratio) + x_offset = 0 + y_offset = (screen_height - new_height) // 2 + + img_resized = img.resize((new_width, new_height), Image.LANCZOS) + final_img = Image.new('RGB', (screen_width, screen_height), 'black') + + if new_width > screen_width: + crop_x = (new_width - screen_width) // 2 + img_resized = img_resized.crop((crop_x, 0, crop_x + screen_width, new_height)) + x_offset = 0 + if new_height > screen_height: + crop_y = (new_height - screen_height) // 2 + img_resized = img_resized.crop((0, crop_y, new_width, crop_y + screen_height)) + y_offset = 0 + + final_img.paste(img_resized, (x_offset, y_offset)) + return final_img, (x_offset, y_offset) + + else: # fit mode + screen_ratio = screen_width / screen_height + img_ratio = img_width / img_height + + if img_ratio > screen_ratio: + new_width = screen_width + new_height = int(screen_width / img_ratio) + else: + new_height = screen_height + new_width = int(screen_height * img_ratio) + + img_resized = img.resize((new_width, new_height), Image.LANCZOS) + final_img = Image.new('RGB', (screen_width, screen_height), 'black') + x_offset = (screen_width - new_width) // 2 + y_offset = (screen_height - new_height) // 2 + final_img.paste(img_resized, (x_offset, y_offset)) + + return final_img, (x_offset, y_offset) + + # Test image path + test_image = "/home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg" + + if not os.path.exists(test_image): + print(f"Test image not found: {test_image}") + return + + try: + # Load test image + img = Image.open(test_image) + original_size = img.size + screen_width, screen_height = 800, 600 + + print(f"Testing scaling modes for image: {original_size}") + print(f"Target screen size: {screen_width}x{screen_height}") + + # Test each scaling mode + modes = ['fit', 'fill', 'stretch'] + + for mode in modes: + final_img, offset = scale_image_to_screen(img, screen_width, screen_height, mode) + print(f"{mode.upper()} mode: Final size: {final_img.size}, Offset: {offset}") + + print("โœ… All scaling modes tested successfully!") + + except Exception as e: + print(f"โŒ Error testing scaling: {e}") + +if __name__ == "__main__": + test_scaling_modes() diff --git a/test_touch.py b/test_touch.py new file mode 100644 index 0000000..ab3b82d --- /dev/null +++ b/test_touch.py @@ -0,0 +1,230 @@ +#!/usr/bin/env python3 +""" +Touch Display Test - Test the touch-optimized interface with virtual keyboard +""" +import tkinter as tk +import sys +import os +sys.path.append('tkinter_app/src') + +def test_touch_interface(): + """Test the touch-optimized settings interface""" + try: + from tkinter_simple_player import SettingsWindow + + # Create main window + root = tk.Tk() + root.title("๐ŸŽฎ Touch Display Test") + root.geometry("1024x768") + root.configure(bg='#2c3e50') + + # Create welcome screen + welcome_frame = tk.Frame(root, bg='#2c3e50', padx=40, pady=40) + welcome_frame.pack(fill=tk.BOTH, expand=True) + + # Title + title_label = tk.Label(welcome_frame, + text="๐ŸŽฌ Touch Display Digital Signage", + font=('Segoe UI', 24, 'bold'), + fg='white', bg='#2c3e50') + title_label.pack(pady=30) + + # Description + desc_text = ( + "Touch-Optimized Features:\n\n" + "๐Ÿ“ฑ Virtual On-Screen Keyboard\n" + "๐ŸŽฏ Larger Touch-Friendly Buttons\n" + "โŒจ๏ธ Auto-Show Keyboard on Input Focus\n" + "๐Ÿ‘† Enhanced Touch Feedback\n" + "๐ŸŽจ Dark Theme Optimized for Displays\n\n" + "Click the button below to test the settings interface:" + ) + + desc_label = tk.Label(welcome_frame, text=desc_text, + font=('Segoe UI', 14), + fg='#ecf0f1', bg='#2c3e50', + justify=tk.CENTER) + desc_label.pack(pady=20) + + # Create mock app for testing + class MockApp: + def __init__(self): + self.playlist = [] + self.current_index = 0 + + def play_current_media(self): + print("Mock: play_current_media called") + + mock_app = MockApp() + + # Test button to open touch-optimized settings + def open_touch_settings(): + try: + settings = SettingsWindow(root, mock_app) + print("โœ… Touch-optimized settings window opened successfully!") + except Exception as e: + print(f"โŒ Error opening settings: {e}") + import traceback + traceback.print_exc() + + # Large touch-friendly button + settings_btn = tk.Button(welcome_frame, + text="๐Ÿ”ง Open Touch Settings", + command=open_touch_settings, + bg='#3498db', fg='white', + font=('Segoe UI', 16, 'bold'), + relief=tk.FLAT, padx=40, pady=20, + cursor='hand2') + settings_btn.pack(pady=30) + + # Instructions + instructions = ( + "Touch Instructions:\n" + "โ€ข Tap input fields to show virtual keyboard\n" + "โ€ข Use large buttons for easy touch interaction\n" + "โ€ข Virtual keyboard stays on top for easy access\n" + "โ€ข Click outside input fields to hide keyboard" + ) + + instr_label = tk.Label(welcome_frame, text=instructions, + font=('Segoe UI', 11), + fg='#bdc3c7', bg='#2c3e50', + justify=tk.LEFT) + instr_label.pack(pady=20) + + # Exit button + exit_btn = tk.Button(welcome_frame, + text="โŒ Exit Test", + command=root.quit, + bg='#e74c3c', fg='white', + font=('Segoe UI', 12, 'bold'), + relief=tk.FLAT, padx=30, pady=15, + cursor='hand2') + exit_btn.pack(pady=20) + + # Add touch feedback to buttons + def add_touch_feedback(button): + def on_press(e): + button.configure(relief=tk.SUNKEN) + def on_release(e): + button.configure(relief=tk.FLAT) + def on_enter(e): + button.configure(relief=tk.RAISED) + def on_leave(e): + button.configure(relief=tk.FLAT) + + button.bind("", on_press) + button.bind("", on_release) + button.bind("", on_enter) + button.bind("", on_leave) + + add_touch_feedback(settings_btn) + add_touch_feedback(exit_btn) + + print("๐ŸŽฎ Touch Display Test Started") + print("=" * 50) + print("Features being tested:") + print("- Virtual keyboard integration") + print("- Touch-optimized input fields") + print("- Large, finger-friendly buttons") + print("- Enhanced visual feedback") + print("- Dark theme for displays") + print("\nClick 'Open Touch Settings' to test the interface!") + + root.mainloop() + + except Exception as e: + print(f"โŒ Error in touch interface test: {e}") + import traceback + traceback.print_exc() + +def test_virtual_keyboard_standalone(): + """Test just the virtual keyboard component""" + try: + from virtual_keyboard import VirtualKeyboard, TouchOptimizedEntry, TouchOptimizedButton + + root = tk.Tk() + root.title("๐ŸŽน Virtual Keyboard Test") + root.geometry("800x500") + root.configure(bg='#2f3136') + + # Create virtual keyboard + vk = VirtualKeyboard(root, dark_theme=True) + + # Test interface + test_frame = tk.Frame(root, bg='#2f3136', padx=30, pady=30) + test_frame.pack(fill=tk.BOTH, expand=True) + + tk.Label(test_frame, text="๐ŸŽน Virtual Keyboard Test", + font=('Segoe UI', 20, 'bold'), + bg='#2f3136', fg='white').pack(pady=20) + + tk.Label(test_frame, text="Click on the input fields below to test the virtual keyboard:", + font=('Segoe UI', 12), + bg='#2f3136', fg='#b9bbbe').pack(pady=10) + + # Test input fields + tk.Label(test_frame, text="Server IP:", bg='#2f3136', fg='white', + font=('Segoe UI', 11, 'bold')).pack(anchor=tk.W, pady=(20, 5)) + entry1 = TouchOptimizedEntry(test_frame, vk, width=40, bg='#36393f', + fg='white', insertbackground='white') + entry1.pack(pady=5, fill=tk.X) + + tk.Label(test_frame, text="Device Name:", bg='#2f3136', fg='white', + font=('Segoe UI', 11, 'bold')).pack(anchor=tk.W, pady=(15, 5)) + entry2 = TouchOptimizedEntry(test_frame, vk, width=40, bg='#36393f', + fg='white', insertbackground='white') + entry2.pack(pady=5, fill=tk.X) + + tk.Label(test_frame, text="Password:", bg='#2f3136', fg='white', + font=('Segoe UI', 11, 'bold')).pack(anchor=tk.W, pady=(15, 5)) + entry3 = TouchOptimizedEntry(test_frame, vk, width=40, bg='#36393f', + fg='white', insertbackground='white', show='*') + entry3.pack(pady=5, fill=tk.X) + + # Control buttons + btn_frame = tk.Frame(test_frame, bg='#2f3136') + btn_frame.pack(pady=30) + + TouchOptimizedButton(btn_frame, text="๐ŸŽน Show Keyboard", + command=lambda: vk.show_keyboard(entry1), + bg='#7289da', fg='white').pack(side=tk.LEFT, padx=10) + + TouchOptimizedButton(btn_frame, text="โŒ Hide Keyboard", + command=vk.hide_keyboard, + bg='#ed4245', fg='white').pack(side=tk.LEFT, padx=10) + + TouchOptimizedButton(btn_frame, text="๐Ÿ”„ Clear All", + command=lambda: [e.delete(0, tk.END) for e in [entry1, entry2, entry3]], + bg='#faa61a', fg='white').pack(side=tk.LEFT, padx=10) + + print("๐ŸŽน Virtual Keyboard Test Started") + print("- Click input fields to auto-show keyboard") + print("- Type using virtual or physical keyboard") + print("- Test touch-friendly interface") + + root.mainloop() + + except Exception as e: + print(f"โŒ Error in virtual keyboard test: {e}") + import traceback + traceback.print_exc() + +if __name__ == "__main__": + import argparse + + parser = argparse.ArgumentParser(description="Touch Display Tests") + parser.add_argument("--keyboard-only", action="store_true", + help="Test only the virtual keyboard component") + + args = parser.parse_args() + + print("๐ŸŽฎ Touch Display Digital Signage Tests") + print("=" * 50) + + if args.keyboard_only: + test_virtual_keyboard_standalone() + else: + test_touch_interface() + + print("\nโœ… Touch display tests completed!") diff --git a/tkinter_app/resources/log.txt b/tkinter_app/resources/log.txt index d6a140a..5576e56 100644 --- a/tkinter_app/resources/log.txt +++ b/tkinter_app/resources/log.txt @@ -859,3 +859,328 @@ [INFO] [SignageApp] python_functions: Starting load_config function. [INFO] [SignageApp] python_functions: Configuration file loaded successfully. [INFO] [SignageApp] Application exit requested +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Configuration loaded: server=192.168.1.245, host=tv-holba1, quick=8887779, port=5000 +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Starting load_local_playlist function. +[INFO] [SignageApp] python_functions: Local playlist loaded: {'playlist': [{'file_name': '1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg', 'url': 'static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg', 'duration': 20}, {'file_name': 'wp2782770-1846651530.jpg', 'url': 'static/resurse/wp2782770-1846651530.jpg', 'duration': 15}, {'file_name': 'SampleVideo_1280x720_1mb.mp4', 'url': 'static/resurse/SampleVideo_1280x720_1mb.mp4', 'duration': 5}], 'version': 5} +[INFO] [SignageApp] python_functions: Finished load_local_playlist function successfully. +[INFO] [SignageApp] Found fallback playlist with 3 items +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] Initializing with settings: server=192.168.1.245, host=tv-holba1, port=5000 +[INFO] [SignageApp] Attempting to connect to server... +[INFO] [SignageApp] Fetching playlist from URL: http://192.168.1.245:5000/api/playlists with params: {'hostname': 'tv-holba1', 'quickconnect_code': '8887779'} +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Configuration loaded: server=digi-server.moto-adv.com, host=tv-terasa, quick=8887779, port=8880 +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Starting load_local_playlist function. +[INFO] [SignageApp] python_functions: Local playlist loaded: {'playlist': [{'file_name': '1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg', 'url': 'static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg', 'duration': 20}, {'file_name': 'wp2782770-1846651530.jpg', 'url': 'static/resurse/wp2782770-1846651530.jpg', 'duration': 15}, {'file_name': 'SampleVideo_1280x720_1mb.mp4', 'url': 'static/resurse/SampleVideo_1280x720_1mb.mp4', 'duration': 5}], 'version': 5} +[INFO] [SignageApp] python_functions: Finished load_local_playlist function successfully. +[INFO] [SignageApp] Found fallback playlist with 3 items +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] Initializing with settings: server=digi-server.moto-adv.com, host=tv-terasa, port=8880 +[INFO] [SignageApp] Attempting to connect to server... +[INFO] [SignageApp] Fetching playlist from URL: http://digi-server.moto-adv.com:8880/api/playlists with params: {'hostname': 'tv-terasa', 'quickconnect_code': '8887779'} +[ERROR] [SignageApp] Failed to fetch playlist: HTTPConnectionPool(host='digi-server.moto-adv.com', port=8880): Max retries exceeded with url: /api/playlists?hostname=tv-terasa&quickconnect_code=8887779 (Caused by NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')) +[WARNING] [SignageApp] Server returned empty playlist, falling back to local playlist +[INFO] [SignageApp] Loaded fallback playlist with 3 items +[INFO] [SignageApp] Playing media: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +2025-08-05 19:12:35 - STARTED: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +[INFO] [SignageApp] Starting Simple Tkinter Media Player +[INFO] [SignageApp] Loading configuration in settings window +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] Config loaded: {'screen_orientation': 'Landscape', 'screen_name': 'tv-terasa', 'quickconnect_key': '8887779', 'server_ip': 'digi-server.moto-adv.com', 'port': '8880', 'screen_w': '1920', 'screen_h': '1080', 'playlist_version': 5} +[INFO] [SignageApp] Configuration values loaded successfully in settings +[INFO] [SignageApp] Playing media: wp2782770-1846651530.jpg from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/wp2782770-1846651530.jpg +2025-08-05 19:12:55 - STARTED: wp2782770-1846651530.jpg +[INFO] [SignageApp] Playing media: SampleVideo_1280x720_1mb.mp4 from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +2025-08-05 19:13:10 - STARTED: SampleVideo_1280x720_1mb.mp4 +[ERROR] [SignageApp] Error playing video /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4: name 'ImageTk' is not defined +[INFO] [SignageApp] Fetching playlist from URL: http://digi-server.moto-adv.com:8880/api/playlists with params: {'hostname': 'tv-terasa', 'quickconnect_code': '8887779'} +[ERROR] [SignageApp] Failed to fetch playlist: HTTPConnectionPool(host='digi-server.moto-adv.com', port=8880): Max retries exceeded with url: /api/playlists?hostname=tv-terasa&quickconnect_code=8887779 (Caused by NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')) +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] Playing media: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +2025-08-05 19:13:16 - STARTED: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +[INFO] [SignageApp] Fetching playlist from URL: http://digi-server.moto-adv.com:8880/api/playlists with params: {'hostname': 'tv-terasa', 'quickconnect_code': '8887779'} +[ERROR] [SignageApp] Failed to fetch playlist: HTTPConnectionPool(host='digi-server.moto-adv.com', port=8880): Max retries exceeded with url: /api/playlists?hostname=tv-terasa&quickconnect_code=8887779 (Caused by NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')) +[INFO] [SignageApp] No playlist updates available +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] Application exit requested +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Configuration loaded: server=digi-server.moto-adv.com, host=tv-terasa, quick=8887779, port=8880 +[INFO] [SignageApp] Loading configuration in settings window +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] Config loaded: {'screen_orientation': 'Landscape', 'screen_name': 'tv-terasa', 'quickconnect_key': '8887779', 'server_ip': 'digi-server.moto-adv.com', 'port': '8880', 'screen_w': '1920', 'screen_h': '1080', 'playlist_version': 5} +[INFO] [SignageApp] Configuration values loaded successfully in settings +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Configuration loaded: server=digi-server.moto-adv.com, host=tv-terasa, quick=8887779, port=8880 +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Starting load_local_playlist function. +[INFO] [SignageApp] python_functions: Local playlist loaded: {'playlist': [{'file_name': '1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg', 'url': 'static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg', 'duration': 20}, {'file_name': 'wp2782770-1846651530.jpg', 'url': 'static/resurse/wp2782770-1846651530.jpg', 'duration': 15}, {'file_name': 'SampleVideo_1280x720_1mb.mp4', 'url': 'static/resurse/SampleVideo_1280x720_1mb.mp4', 'duration': 5}], 'version': 5} +[INFO] [SignageApp] python_functions: Finished load_local_playlist function successfully. +[INFO] [SignageApp] Found fallback playlist with 3 items +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] Initializing with settings: server=digi-server.moto-adv.com, host=tv-terasa, port=8880 +[INFO] [SignageApp] Attempting to connect to server... +[INFO] [SignageApp] Fetching playlist from URL: http://digi-server.moto-adv.com:8880/api/playlists with params: {'hostname': 'tv-terasa', 'quickconnect_code': '8887779'} +[ERROR] [SignageApp] Failed to fetch playlist: HTTPConnectionPool(host='digi-server.moto-adv.com', port=8880): Max retries exceeded with url: /api/playlists?hostname=tv-terasa&quickconnect_code=8887779 (Caused by NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')) +[WARNING] [SignageApp] Server returned empty playlist, falling back to local playlist +[INFO] [SignageApp] Loaded fallback playlist with 3 items +[INFO] [SignageApp] Playing media: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +2025-08-06 01:11:39 - STARTED: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +[INFO] [SignageApp] Starting Simple Tkinter Media Player +[INFO] [SignageApp] Playing media: wp2782770-1846651530.jpg from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/wp2782770-1846651530.jpg +2025-08-06 01:11:59 - STARTED: wp2782770-1846651530.jpg +[INFO] [SignageApp] Playing media: SampleVideo_1280x720_1mb.mp4 from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +2025-08-06 01:12:14 - STARTED: SampleVideo_1280x720_1mb.mp4 +[ERROR] [SignageApp] Error playing video /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4: name 'ImageTk' is not defined +[INFO] [SignageApp] Loading configuration in settings window +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] Config loaded: {'screen_orientation': 'Landscape', 'screen_name': 'tv-terasa', 'quickconnect_key': '8887779', 'server_ip': 'digi-server.moto-adv.com', 'port': '8880', 'screen_w': '1920', 'screen_h': '1080', 'playlist_version': 5} +[INFO] [SignageApp] Configuration values loaded successfully in settings +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] Playing media: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +2025-08-06 01:12:20 - STARTED: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +[INFO] [SignageApp] Fetching playlist from URL: http://digi-server.moto-adv.com:8880/api/playlists with params: {'hostname': 'tv-terasa', 'quickconnect_code': '8887779'} +[ERROR] [SignageApp] Failed to fetch playlist: HTTPConnectionPool(host='digi-server.moto-adv.com', port=8880): Max retries exceeded with url: /api/playlists?hostname=tv-terasa&quickconnect_code=8887779 (Caused by NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')) +[INFO] [SignageApp] No playlist updates available +[INFO] [SignageApp] Playing media: wp2782770-1846651530.jpg from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/wp2782770-1846651530.jpg +2025-08-06 01:12:40 - STARTED: wp2782770-1846651530.jpg +[INFO] [SignageApp] Playing media: SampleVideo_1280x720_1mb.mp4 from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +2025-08-06 01:12:55 - STARTED: SampleVideo_1280x720_1mb.mp4 +[ERROR] [SignageApp] Error playing video /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4: name 'ImageTk' is not defined +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] Playing media: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +2025-08-06 01:13:00 - STARTED: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] Fetching playlist from URL: http://digi-server.moto-adv.com:8880/api/playlists with params: {'hostname': 'tv-terasa', 'quickconnect_code': '8887779'} +[ERROR] [SignageApp] Failed to fetch playlist: HTTPConnectionPool(host='digi-server.moto-adv.com', port=8880): Max retries exceeded with url: /api/playlists?hostname=tv-terasa&quickconnect_code=8887779 (Caused by NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')) +[INFO] [SignageApp] No playlist updates available +[INFO] [SignageApp] Application exit requested +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Configuration loaded: server=digi-server.moto-adv.com, host=tv-terasa, quick=8887779, port=8880 +[INFO] [SignageApp] Loading configuration in enhanced settings window +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] Config loaded: {'screen_orientation': 'Landscape', 'screen_name': 'tv-terasa', 'quickconnect_key': '8887779', 'server_ip': 'digi-server.moto-adv.com', 'port': '8880', 'screen_w': '1920', 'screen_h': '1080', 'playlist_version': 5} +[INFO] [SignageApp] Configuration values loaded successfully in enhanced settings +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Configuration loaded: server=digi-server.moto-adv.com, host=tv-terasa, quick=8887779, port=8880 +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Starting load_local_playlist function. +[INFO] [SignageApp] python_functions: Local playlist loaded: {'playlist': [{'file_name': '1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg', 'url': 'static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg', 'duration': 20}, {'file_name': 'wp2782770-1846651530.jpg', 'url': 'static/resurse/wp2782770-1846651530.jpg', 'duration': 15}, {'file_name': 'SampleVideo_1280x720_1mb.mp4', 'url': 'static/resurse/SampleVideo_1280x720_1mb.mp4', 'duration': 5}], 'version': 5} +[INFO] [SignageApp] python_functions: Finished load_local_playlist function successfully. +[INFO] [SignageApp] Found fallback playlist with 3 items +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] Initializing with settings: server=digi-server.moto-adv.com, host=tv-terasa, port=8880 +[INFO] [SignageApp] Attempting to connect to server... +[INFO] [SignageApp] Fetching playlist from URL: http://digi-server.moto-adv.com:8880/api/playlists with params: {'hostname': 'tv-terasa', 'quickconnect_code': '8887779'} +[ERROR] [SignageApp] Failed to fetch playlist: HTTPConnectionPool(host='digi-server.moto-adv.com', port=8880): Max retries exceeded with url: /api/playlists?hostname=tv-terasa&quickconnect_code=8887779 (Caused by NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')) +[WARNING] [SignageApp] Server returned empty playlist, falling back to local playlist +[INFO] [SignageApp] Loaded fallback playlist with 3 items +[INFO] [SignageApp] Playing media: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +2025-08-06 01:31:08 - STARTED: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +[INFO] [SignageApp] Starting Simple Tkinter Media Player +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] Playing media: wp2782770-1846651530.jpg from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/wp2782770-1846651530.jpg +2025-08-06 01:31:28 - STARTED: wp2782770-1846651530.jpg +[INFO] [SignageApp] Application exit requested +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Configuration loaded: server=digi-server.moto-adv.com, host=tv-terasa, quick=8887779, port=8880 +[INFO] [SignageApp] Loading configuration in enhanced settings window +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] Config loaded: {'screen_orientation': 'Landscape', 'screen_name': 'tv-terasa', 'quickconnect_key': '8887779', 'server_ip': 'digi-server.moto-adv.com', 'port': '8880', 'screen_w': '1920', 'screen_h': '1080', 'playlist_version': 5} +[INFO] [SignageApp] Configuration values loaded successfully in enhanced settings +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Configuration loaded: server=digi-server.moto-adv.com, host=tv-terasa, quick=8887779, port=8880 +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Configuration loaded: server=digi-server.moto-adv.com, host=tv-terasa, quick=8887779, port=8880 +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Starting load_local_playlist function. +[INFO] [SignageApp] python_functions: Local playlist loaded: {'playlist': [{'file_name': '1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg', 'url': 'static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg', 'duration': 20}, {'file_name': 'wp2782770-1846651530.jpg', 'url': 'static/resurse/wp2782770-1846651530.jpg', 'duration': 15}, {'file_name': 'SampleVideo_1280x720_1mb.mp4', 'url': 'static/resurse/SampleVideo_1280x720_1mb.mp4', 'duration': 5}], 'version': 5} +[INFO] [SignageApp] python_functions: Finished load_local_playlist function successfully. +[INFO] [SignageApp] Found fallback playlist with 3 items +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] Initializing with settings: server=digi-server.moto-adv.com, host=tv-terasa, port=8880 +[INFO] [SignageApp] Attempting to connect to server... +[INFO] [SignageApp] Fetching playlist from URL: http://digi-server.moto-adv.com:8880/api/playlists with params: {'hostname': 'tv-terasa', 'quickconnect_code': '8887779'} +[ERROR] [SignageApp] Failed to fetch playlist: HTTPConnectionPool(host='digi-server.moto-adv.com', port=8880): Max retries exceeded with url: /api/playlists?hostname=tv-terasa&quickconnect_code=8887779 (Caused by NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')) +[WARNING] [SignageApp] Server returned empty playlist, falling back to local playlist +[INFO] [SignageApp] Loaded fallback playlist with 3 items +[INFO] [SignageApp] Playing media: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +2025-08-06 01:51:49 - STARTED: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +[INFO] [SignageApp] Starting Simple Tkinter Media Player +[INFO] [SignageApp] Loading configuration in enhanced settings window +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] Config loaded: {'screen_orientation': 'Landscape', 'screen_name': 'tv-terasa', 'quickconnect_key': '8887779', 'server_ip': 'digi-server.moto-adv.com', 'port': '8880', 'screen_w': '1920', 'screen_h': '1080', 'playlist_version': 5} +[INFO] [SignageApp] Configuration values loaded successfully in enhanced settings +[INFO] [SignageApp] Playing media: wp2782770-1846651530.jpg from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/wp2782770-1846651530.jpg +2025-08-06 01:52:09 - STARTED: wp2782770-1846651530.jpg +[INFO] [SignageApp] Playing media: SampleVideo_1280x720_1mb.mp4 from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +2025-08-06 01:52:24 - STARTED: SampleVideo_1280x720_1mb.mp4 +[ERROR] [SignageApp] Error playing video /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4: name 'ImageTk' is not defined +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] Playing media: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +2025-08-06 01:52:30 - STARTED: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +[INFO] [SignageApp] Fetching playlist from URL: http://digi-server.moto-adv.com:8880/api/playlists with params: {'hostname': 'tv-terasa', 'quickconnect_code': '8887779'} +[ERROR] [SignageApp] Failed to fetch playlist: HTTPConnectionPool(host='digi-server.moto-adv.com', port=8880): Max retries exceeded with url: /api/playlists?hostname=tv-terasa&quickconnect_code=8887779 (Caused by NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')) +[INFO] [SignageApp] No playlist updates available +[INFO] [SignageApp] Playing media: wp2782770-1846651530.jpg from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/wp2782770-1846651530.jpg +2025-08-06 01:52:50 - STARTED: wp2782770-1846651530.jpg +[INFO] [SignageApp] Playing media: SampleVideo_1280x720_1mb.mp4 from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +2025-08-06 01:53:05 - STARTED: SampleVideo_1280x720_1mb.mp4 +[ERROR] [SignageApp] Error playing video /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4: name 'ImageTk' is not defined +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] Playing media: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +2025-08-06 01:53:05 - STARTED: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +[INFO] [SignageApp] Fetching playlist from URL: http://digi-server.moto-adv.com:8880/api/playlists with params: {'hostname': 'tv-terasa', 'quickconnect_code': '8887779'} +[ERROR] [SignageApp] Failed to fetch playlist: HTTPConnectionPool(host='digi-server.moto-adv.com', port=8880): Max retries exceeded with url: /api/playlists?hostname=tv-terasa&quickconnect_code=8887779 (Caused by NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')) +[INFO] [SignageApp] No playlist updates available +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] Application exit requested +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Configuration loaded: server=digi-server.moto-adv.com, host=tv-terasa, quick=8887779, port=8880 +[INFO] [SignageApp] python_functions: Starting load_local_playlist function. +[INFO] [SignageApp] python_functions: Local playlist loaded: {'playlist': [{'file_name': '1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg', 'url': 'static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg', 'duration': 20}, {'file_name': 'wp2782770-1846651530.jpg', 'url': 'static/resurse/wp2782770-1846651530.jpg', 'duration': 15}, {'file_name': 'SampleVideo_1280x720_1mb.mp4', 'url': 'static/resurse/SampleVideo_1280x720_1mb.mp4', 'duration': 5}], 'version': 5} +[INFO] [SignageApp] python_functions: Finished load_local_playlist function successfully. +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Configuration loaded: server=digi-server.moto-adv.com, host=tv-terasa, quick=8887779, port=8880 +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Starting load_local_playlist function. +[INFO] [SignageApp] python_functions: Local playlist loaded: {'playlist': [{'file_name': '1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg', 'url': 'static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg', 'duration': 20}, {'file_name': 'wp2782770-1846651530.jpg', 'url': 'static/resurse/wp2782770-1846651530.jpg', 'duration': 15}, {'file_name': 'SampleVideo_1280x720_1mb.mp4', 'url': 'static/resurse/SampleVideo_1280x720_1mb.mp4', 'duration': 5}], 'version': 5} +[INFO] [SignageApp] python_functions: Finished load_local_playlist function successfully. +[INFO] [SignageApp] Found fallback playlist with 3 items +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] Initializing with settings: server=digi-server.moto-adv.com, host=tv-terasa, port=8880 +[INFO] [SignageApp] Attempting to connect to server... +[INFO] [SignageApp] Fetching playlist from URL: http://digi-server.moto-adv.com:8880/api/playlists with params: {'hostname': 'tv-terasa', 'quickconnect_code': '8887779'} +[ERROR] [SignageApp] Failed to fetch playlist: HTTPConnectionPool(host='digi-server.moto-adv.com', port=8880): Max retries exceeded with url: /api/playlists?hostname=tv-terasa&quickconnect_code=8887779 (Caused by NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known')) +[WARNING] [SignageApp] Server returned empty playlist, falling back to local playlist +[INFO] [SignageApp] Loaded fallback playlist with 3 items +[INFO] [SignageApp] Playing media: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +2025-08-06 02:02:39 - STARTED: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +[INFO] [SignageApp] Successfully displayed image: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg ((1600, 1000)) +[INFO] [SignageApp] Starting Simple Tkinter Media Player +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] Application exit requested +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Configuration loaded: server=digi-signage.moto-adv.com, host=tv-terasa, quick=8887779, port=8880 +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Configuration loaded: server=digi-signage.moto-adv.com, host=tv-terasa, quick=8887779, port=8880 +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Starting load_local_playlist function. +[INFO] [SignageApp] python_functions: Local playlist loaded: {'playlist': [{'file_name': '1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg', 'url': 'static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg', 'duration': 20}, {'file_name': 'wp2782770-1846651530.jpg', 'url': 'static/resurse/wp2782770-1846651530.jpg', 'duration': 15}, {'file_name': 'SampleVideo_1280x720_1mb.mp4', 'url': 'static/resurse/SampleVideo_1280x720_1mb.mp4', 'duration': 5}], 'version': 5} +[INFO] [SignageApp] python_functions: Finished load_local_playlist function successfully. +[INFO] [SignageApp] Found fallback playlist with 3 items +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] Initializing with settings: server=digi-signage.moto-adv.com, host=tv-terasa, port=8880 +[INFO] [SignageApp] Attempting to connect to server... +[INFO] [SignageApp] Fetching playlist from URL: http://digi-signage.moto-adv.com:8880/api/playlists with params: {'hostname': 'tv-terasa', 'quickconnect_code': '8887779'} +[ERROR] [SignageApp] Failed to fetch playlist. Status Code: 522 +[WARNING] [SignageApp] Server returned empty playlist, falling back to local playlist +[INFO] [SignageApp] Loading configuration in enhanced settings window +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] Config loaded: {'screen_orientation': 'Landscape', 'screen_name': 'tv-terasa', 'quickconnect_key': '8887779', 'server_ip': 'digi-signage.moto-adv.com', 'port': '8880', 'screen_w': '1920', 'screen_h': '1080', 'playlist_version': 5} +[INFO] [SignageApp] Configuration values loaded successfully in enhanced settings +[INFO] [SignageApp] Loaded fallback playlist with 3 items +[INFO] [SignageApp] Playing media: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +2025-08-06 02:14:39 - STARTED: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +[INFO] [SignageApp] Successfully displayed image: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg (Original: (1600, 1000), Screen: 3840x2160, Mode: fit, Offset: (192, 0)) +[INFO] [SignageApp] Starting Simple Tkinter Media Player +[INFO] [SignageApp] Playing media: wp2782770-1846651530.jpg from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/wp2782770-1846651530.jpg +2025-08-06 02:15:03 - STARTED: wp2782770-1846651530.jpg +[INFO] [SignageApp] Successfully displayed image: wp2782770-1846651530.jpg (Original: (3840, 2400), Screen: 3840x2160, Mode: fit, Offset: (192, 0)) +[INFO] [SignageApp] Playing media: SampleVideo_1280x720_1mb.mp4 from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +2025-08-06 02:15:23 - STARTED: SampleVideo_1280x720_1mb.mp4 +[INFO] [SignageApp] Video dimensions: 1280x720, Screen dimensions: 3840x2160 +[INFO] [SignageApp] Media paused +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] Playing media: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +2025-08-06 02:17:55 - STARTED: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +[INFO] [SignageApp] Fetching playlist from URL: http://digi-signage.moto-adv.com:8880/api/playlists with params: {'hostname': 'tv-terasa', 'quickconnect_code': '8887779'} +[INFO] [SignageApp] Successfully displayed image: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg (Original: (1600, 1000), Screen: 3840x2160, Mode: fit, Offset: (192, 0)) +[INFO] [SignageApp] Application exit requested +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Configuration loaded: server=digi-signage.moto-adv.com, host=tv-terasa, quick=8887779, port=8880 +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] python_functions: Starting load_local_playlist function. +[INFO] [SignageApp] python_functions: Local playlist loaded: {'playlist': [{'file_name': '1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg', 'url': 'static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg', 'duration': 20}, {'file_name': 'wp2782770-1846651530.jpg', 'url': 'static/resurse/wp2782770-1846651530.jpg', 'duration': 15}, {'file_name': 'SampleVideo_1280x720_1mb.mp4', 'url': 'static/resurse/SampleVideo_1280x720_1mb.mp4', 'duration': 5}], 'version': 5} +[INFO] [SignageApp] python_functions: Finished load_local_playlist function successfully. +[INFO] [SignageApp] Found fallback playlist with 3 items +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] Initializing with settings: server=digi-signage.moto-adv.com, host=tv-terasa, port=8880 +[INFO] [SignageApp] Attempting to connect to server... +[INFO] [SignageApp] Fetching playlist from URL: http://digi-signage.moto-adv.com:8880/api/playlists with params: {'hostname': 'tv-terasa', 'quickconnect_code': '8887779'} +[ERROR] [SignageApp] Failed to fetch playlist. Status Code: 522 +[WARNING] [SignageApp] Server returned empty playlist, falling back to local playlist +[INFO] [SignageApp] Loaded fallback playlist with 3 items +[INFO] [SignageApp] Playing media: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +2025-08-06 02:20:20 - STARTED: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +[INFO] [SignageApp] Successfully displayed image: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg (Original: (1600, 1000), Screen: 1920x1080, Mode: fit, Offset: (96, 0)) +[INFO] [SignageApp] Starting Simple Tkinter Media Player +[INFO] [SignageApp] Playing media: wp2782770-1846651530.jpg from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/wp2782770-1846651530.jpg +2025-08-06 02:20:40 - STARTED: wp2782770-1846651530.jpg +[INFO] [SignageApp] Successfully displayed image: wp2782770-1846651530.jpg (Original: (3840, 2400), Screen: 1920x1080, Mode: fit, Offset: (96, 0)) +[INFO] [SignageApp] Playing media: SampleVideo_1280x720_1mb.mp4 from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +2025-08-06 02:20:57 - STARTED: SampleVideo_1280x720_1mb.mp4 +[INFO] [SignageApp] Video dimensions: 1280x720, Screen dimensions: 1920x1080 +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] Playing media: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg from /home/pi/Desktop/signage-player/tkinter_app/src/static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +2025-08-06 02:21:44 - STARTED: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] Fetching playlist from URL: http://digi-signage.moto-adv.com:8880/api/playlists with params: {'hostname': 'tv-terasa', 'quickconnect_code': '8887779'} +[INFO] [SignageApp] Successfully displayed image: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg (Original: (1600, 1000), Screen: 1920x1080, Mode: fit, Offset: (96, 0)) +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] python_functions: Configuration file loaded successfully. +[INFO] [SignageApp] Application exit requested diff --git a/tkinter_app/src/__pycache__/logging_config.cpython-311.pyc b/tkinter_app/src/__pycache__/logging_config.cpython-311.pyc index b5f8328..3cd240a 100644 Binary files a/tkinter_app/src/__pycache__/logging_config.cpython-311.pyc and b/tkinter_app/src/__pycache__/logging_config.cpython-311.pyc differ diff --git a/tkinter_app/src/__pycache__/python_functions.cpython-311.pyc b/tkinter_app/src/__pycache__/python_functions.cpython-311.pyc index b2535e9..2dc7847 100644 Binary files a/tkinter_app/src/__pycache__/python_functions.cpython-311.pyc and b/tkinter_app/src/__pycache__/python_functions.cpython-311.pyc differ diff --git a/tkinter_app/src/__pycache__/tkinter_simple_player.cpython-311.pyc b/tkinter_app/src/__pycache__/tkinter_simple_player.cpython-311.pyc index 14b84f5..ccfcf60 100644 Binary files a/tkinter_app/src/__pycache__/tkinter_simple_player.cpython-311.pyc and b/tkinter_app/src/__pycache__/tkinter_simple_player.cpython-311.pyc differ diff --git a/tkinter_app/src/__pycache__/virtual_keyboard.cpython-311.pyc b/tkinter_app/src/__pycache__/virtual_keyboard.cpython-311.pyc new file mode 100644 index 0000000..b664ca8 Binary files /dev/null and b/tkinter_app/src/__pycache__/virtual_keyboard.cpython-311.pyc differ