From 47d9ec57794b2c8e2eda4c93627f4a7b857815af Mon Sep 17 00:00:00 2001 From: scheianu Date: Fri, 22 Aug 2025 21:58:18 +0300 Subject: [PATCH] Refactor: Move SettingsWindow to settings_screen.py and use system VLC for video playback --- install_tkinter.sh | 4 +- tkinter_app/resources/app_config.txt | 6 +- tkinter_app/resources/log.txt | 278 ++++++++++++++++++ .../logging_config.cpython-311.pyc | Bin 1379 -> 1379 bytes .../python_functions.cpython-311.pyc | Bin 14937 -> 14937 bytes .../tkinter_simple_player.cpython-311.pyc | Bin 116358 -> 115187 bytes .../virtual_keyboard.cpython-311.pyc | Bin 17542 -> 17542 bytes tkinter_app/src/main.py | 2 - tkinter_app/src/settings_screen.py | 19 ++ tkinter_app/src/tkinter_simple_player.py | 53 ++-- 10 files changed, 323 insertions(+), 39 deletions(-) diff --git a/install_tkinter.sh b/install_tkinter.sh index 0707917..0c5ca7b 100755 --- a/install_tkinter.sh +++ b/install_tkinter.sh @@ -16,9 +16,9 @@ sudo apt install -y libsdl2-dev libsdl2-mixer-dev libsdl2-image-dev libsdl2-ttf- sudo apt install -y libjpeg-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev # Create project directory if it doesn't exist -PROJECT_DIR="/home/pi/Desktop/signage-player" +PROJECT_DIR="/home/pi/Desktop/tkinter_player" if [ ! -d "$PROJECT_DIR" ]; then - echo "Project directory not found. Please ensure the signage-player directory exists." + echo "Project directory not found. Please ensure the tkinter_player directory exists." exit 1 fi diff --git a/tkinter_app/resources/app_config.txt b/tkinter_app/resources/app_config.txt index f9416ae..9436de9 100644 --- a/tkinter_app/resources/app_config.txt +++ b/tkinter_app/resources/app_config.txt @@ -1,9 +1,9 @@ { "screen_orientation": "Landscape", - "screen_name": "tv-holba1", + "screen_name": "tv-terasa", "quickconnect_key": "8887779", - "server_ip": "192.168.1.22", - "port": "80", + "server_ip": "digi-signage.moto-adv.com", + "port": "8880", "screen_w": "1920", "screen_h": "1080", "playlist_version": 0 diff --git a/tkinter_app/resources/log.txt b/tkinter_app/resources/log.txt index 6404c1d..28d3d25 100644 --- a/tkinter_app/resources/log.txt +++ b/tkinter_app/resources/log.txt @@ -1426,3 +1426,281 @@ [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.22, host=tv-holba1, quick=8887779, port=80 +[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.22, host=tv-holba1, port=80 +[INFO] [SignageApp] Attempting to connect to server... +[INFO] [SignageApp] Fetching playlist from URL: http://192.168.1.22:80/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-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/tkinter_player/tkinter_app/src/static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +2025-08-22 20:07:54 - STARTED: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +[WARNING] [SignageApp] PIL not available - showing text placeholder for image +[INFO] [SignageApp] Starting Simple Tkinter Media Player +[INFO] [SignageApp] Playing media: wp2782770-1846651530.jpg from /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/wp2782770-1846651530.jpg +2025-08-22 20:08:07 - STARTED: wp2782770-1846651530.jpg +[WARNING] [SignageApp] PIL not available - showing text placeholder for image +[INFO] [SignageApp] Playing media: SampleVideo_1280x720_1mb.mp4 from /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +2025-08-22 20:08:10 - STARTED: SampleVideo_1280x720_1mb.mp4 +[INFO] [SignageApp] Starting VLC for video: /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +[ERROR] [SignageApp] VLC error: 'NoneType' object has no attribute 'media_player_new' +[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/tkinter_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-22 20:08:11 - 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'} +[WARNING] [SignageApp] PIL not available - showing text placeholder for image +[INFO] [SignageApp] Playing media: wp2782770-1846651530.jpg from /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/wp2782770-1846651530.jpg +2025-08-22 20:08:17 - STARTED: wp2782770-1846651530.jpg +[WARNING] [SignageApp] PIL not available - showing text placeholder for image +[INFO] [SignageApp] Playing media: SampleVideo_1280x720_1mb.mp4 from /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +2025-08-22 20:08:18 - STARTED: SampleVideo_1280x720_1mb.mp4 +[INFO] [SignageApp] Starting VLC for video: /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +[ERROR] [SignageApp] VLC error: 'NoneType' object has no attribute 'media_player_new' +[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/tkinter_player/tkinter_app/src/static/resurse/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'} +2025-08-22 20:08:19 - STARTED: 1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +[WARNING] [SignageApp] PIL not available - showing text placeholder for image +[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_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] Media paused +[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': 0} +[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/tkinter_player/tkinter_app/src/static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +2025-08-22 20:10:31 - 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/tkinter_player/tkinter_app/src/static/resurse/wp2782770-1846651530.jpg +2025-08-22 20:10:51 - 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/tkinter_player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +2025-08-22 20:11:07 - STARTED: SampleVideo_1280x720_1mb.mp4 +[INFO] [SignageApp] Starting VLC for video: /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +[ERROR] [SignageApp] VLC error: 'NoneType' object has no attribute 'media_player_new' +[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/tkinter_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-22 20:11:08 - 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: 1920x1080, Mode: fit, Offset: (96, 0)) +[ERROR] [SignageApp] Failed to fetch playlist. Status Code: 522 +[INFO] [SignageApp] No playlist updates available +[INFO] [SignageApp] Playing media: wp2782770-1846651530.jpg from /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/wp2782770-1846651530.jpg +2025-08-22 20:11:31 - 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/tkinter_player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +2025-08-22 20:11:47 - STARTED: SampleVideo_1280x720_1mb.mp4 +[INFO] [SignageApp] Starting VLC for video: /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +[ERROR] [SignageApp] VLC error: 'NoneType' object has no attribute 'media_player_new' +[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/tkinter_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-22 20:11:48 - 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: 1920x1080, Mode: fit, Offset: (96, 0)) +[ERROR] [SignageApp] Failed to fetch playlist. Status Code: 522 +[INFO] [SignageApp] No playlist updates available +[INFO] [SignageApp] Playing media: wp2782770-1846651530.jpg from /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/wp2782770-1846651530.jpg +2025-08-22 20:12:09 - 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: wp2782770-1846651530.jpg from /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/wp2782770-1846651530.jpg +2025-08-22 20:12:24 - STARTED: wp2782770-1846651530.jpg +[INFO] [SignageApp] Successfully displayed image: wp2782770-1846651530.jpg (Original: (3840, 2400), Screen: 1920x1080, Mode: fit, Offset: (96, 0)) +[INFO] [SignageApp] Media resumed +[INFO] [SignageApp] Playing media: SampleVideo_1280x720_1mb.mp4 from /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +2025-08-22 20:12:40 - STARTED: SampleVideo_1280x720_1mb.mp4 +[INFO] [SignageApp] Starting VLC for video: /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +[ERROR] [SignageApp] VLC error: 'NoneType' object has no attribute 'media_player_new' +[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/tkinter_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-22 20:12:41 - 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: 1920x1080, Mode: fit, Offset: (96, 0)) +[ERROR] [SignageApp] Failed to fetch playlist. Status Code: 522 +[INFO] [SignageApp] No playlist updates available +[INFO] [SignageApp] Playing media: wp2782770-1846651530.jpg from /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/wp2782770-1846651530.jpg +2025-08-22 20:13:02 - 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/tkinter_player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +2025-08-22 20:13:18 - STARTED: SampleVideo_1280x720_1mb.mp4 +[INFO] [SignageApp] Starting VLC for video: /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +[ERROR] [SignageApp] VLC error: 'NoneType' object has no attribute 'media_player_new' +[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/tkinter_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-22 20:13:19 - 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: 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 +[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/tkinter_player/tkinter_app/src/static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +2025-08-22 20:20:19 - 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/tkinter_player/tkinter_app/src/static/resurse/wp2782770-1846651530.jpg +2025-08-22 20: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/tkinter_player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +2025-08-22 20:20:56 - STARTED: SampleVideo_1280x720_1mb.mp4 +[INFO] [SignageApp] Starting VLC for video: /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +[INFO] [SignageApp] VLC finished: /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +[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/tkinter_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-22 20:21:03 - 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] 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/tkinter_player/tkinter_app/src/static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +2025-08-22 20:22:56 - 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/tkinter_player/tkinter_app/src/static/resurse/wp2782770-1846651530.jpg +2025-08-22 20:23:17 - 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/tkinter_player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +2025-08-22 20:23:33 - STARTED: SampleVideo_1280x720_1mb.mp4 +[INFO] [SignageApp] Starting system VLC subprocess for video: /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +[INFO] [SignageApp] VLC subprocess finished: /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/SampleVideo_1280x720_1mb.mp4 +[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/tkinter_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-22 20:23:40 - 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: 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 +[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/tkinter_player/tkinter_app/src/static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +2025-08-22 21:55:09 - 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: 1920x1018, Mode: fit, Offset: (146, 0)) +[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/tkinter_player/tkinter_app/src/static/resurse/wp2782770-1846651530.jpg +2025-08-22 21:55:30 - STARTED: wp2782770-1846651530.jpg +[INFO] [SignageApp] Successfully displayed image: wp2782770-1846651530.jpg (Original: (3840, 2400), Screen: 1920x1018, Mode: fit, Offset: (146, 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] Media paused +[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/tkinter_player/tkinter_app/src/static/resurse/1307306470-nature_wallpaper_hd_hd_nature_3-3828209637.jpg +2025-08-22 21:57:07 - 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] 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 b8fd7cc7bd3252731fb740687d1714cf72782ebb..cccbea2a004d684b9bfefae34f4c19f87c6e9c84 100644 GIT binary patch delta 34 ocmaFN^_Yu$IWI340}#BOuwoPx# delta 34 ocmaFN^_Yu$IWI340}$|hn7NVr5;I3}W_n&?daCZ`r_6PX0JSs=1ONa4 diff --git a/tkinter_app/src/__pycache__/python_functions.cpython-311.pyc b/tkinter_app/src/__pycache__/python_functions.cpython-311.pyc index aafc50f9f8ea08d7ca920327399c8e5713254b57..4f0eddea01d91f1e3d1171aff09e42929e880a2f 100644 GIT binary patch delta 34 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 bRX!tT4lyOobeax3(`LFYhv^HqZp;4zn9Ii% delta 17541 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 Y!mdp)MqL}PdnJCvwRwhDav8z@2hf1u