From 8f64de240bcf3b8e1582924c2805b1e08089028f Mon Sep 17 00:00:00 2001 From: scheianu Date: Sun, 24 Aug 2025 00:07:53 +0300 Subject: [PATCH] further to check : showing of the meniu on player ui and player ui to run in fullscreen --- tkinter_app/resources/log.txt | 193 ++++++++++++++++++ .../media_playback_controller.cpython-311.pyc | Bin 0 -> 12514 bytes .../__pycache__/player_app.cpython-311.pyc | Bin 39008 -> 30461 bytes tkinter_app/src/main.py | 28 ++- tkinter_app/src/player_app.py | 7 + 5 files changed, 223 insertions(+), 5 deletions(-) create mode 100644 tkinter_app/src/__pycache__/media_playback_controller.cpython-311.pyc diff --git a/tkinter_app/resources/log.txt b/tkinter_app/resources/log.txt index 31ef6e8..22db532 100644 --- a/tkinter_app/resources/log.txt +++ b/tkinter_app/resources/log.txt @@ -5265,3 +5265,196 @@ [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_local_playlist function. +[INFO] [SignageApp] [MAIN] About to show splash screen: /home/pi/Desktop/tkinter_player/tkinter_app/resources/intro1.mp4 +[INFO] [SignageApp] python_functions: Local playlist loaded: {'playlist': [{'file_name': 'Cindrel_1.jpg', 'url': 'static/resurse/Cindrel_1.jpg', 'duration': 10}, {'file_name': 'trans_cindrel_4.jpg', 'url': 'static/resurse/trans_cindrel_4.jpg', 'duration': 10}], 'version': 29} +[INFO] [SignageApp] [SplashScreen] Running splash as standalone VLC subprocess: /home/pi/Desktop/tkinter_player/tkinter_app/resources/intro1.mp4 +[INFO] [SignageApp] python_functions: Finished load_local_playlist function successfully. +[INFO] [SignageApp] [SplashScreen] Launching: cvlc --fullscreen --no-osd --no-video-title-show --play-and-exit --quiet /home/pi/Desktop/tkinter_player/tkinter_app/resources/intro1.mp4 +[INFO] [SignageApp] Found fallback playlist with 2 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/api/playlists with params: {'hostname': 'tv-terasa', 'quickconnect_code': '8887779'} +[INFO] [SignageApp] Server response: {'hashed_quickconnect': '$2b$12$UQzlEHNWudAB4P08Le3YJeWHrZHJkWL44kRQpZ53kt.fDLTcrPzGm', 'playlist': [{'duration': 10, 'file_name': 'Cindrel_1.jpg', 'url': 'http://digi-signage.moto-adv.com/media/Cindrel_1.jpg'}, {'duration': 10, 'file_name': 'trans_cindrel_4.jpg', 'url': 'http://digi-signage.moto-adv.com/media/trans_cindrel_4.jpg'}], 'playlist_version': 29} +[INFO] [SignageApp] Fetched updated playlist from server. +[INFO] [SignageApp] python_functions: Updated playlist version in app_config.txt to 29. +[INFO] [SignageApp] Server playlist found with 2 items, version 29 +[INFO] [SignageApp] python_functions: Starting media file download... +[INFO] [SignageApp] python_functions: File Cindrel_1.jpg already exists. Skipping download. +[INFO] [SignageApp] python_functions: File trans_cindrel_4.jpg already exists. Skipping download. +[INFO] [SignageApp] python_functions: Starting save_local_playlist function. +[INFO] [SignageApp] python_functions: Updated local playlist with server data. +[INFO] [SignageApp] python_functions: Finished save_local_playlist function. +[INFO] [SignageApp] python_functions: Finished media file download and updated local playlist. +[INFO] [SignageApp] python_functions: Updated playlist version in app_config.txt to 29. +[INFO] [SignageApp] python_functions: Starting load_local_playlist function. +[INFO] [SignageApp] python_functions: Local playlist loaded: {'playlist': [{'file_name': 'Cindrel_1.jpg', 'url': 'static/resurse/Cindrel_1.jpg', 'duration': 10}, {'file_name': 'trans_cindrel_4.jpg', 'url': 'static/resurse/trans_cindrel_4.jpg', 'duration': 10}], 'version': 29} +[INFO] [SignageApp] python_functions: Finished load_local_playlist function successfully. +[INFO] [SignageApp] Successfully loaded 2 items from server +[INFO] [SignageApp] [SplashScreen] VLC splash finished. +[INFO] [SignageApp] [MAIN] splash.show() called, entering mainloop... +[INFO] [SignageApp] [MAIN] Splash finished, waiting for playlist... +[INFO] [SignageApp] [MAIN] Playlist loaded: [{'file_name': 'Cindrel_1.jpg', 'url': 'static/resurse/Cindrel_1.jpg', 'duration': 10}, {'file_name': 'trans_cindrel_4.jpg', 'url': 'static/resurse/trans_cindrel_4.jpg', 'duration': 10}] +[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': 'Cindrel_1.jpg', 'url': 'static/resurse/Cindrel_1.jpg', 'duration': 10}, {'file_name': 'trans_cindrel_4.jpg', 'url': 'static/resurse/trans_cindrel_4.jpg', 'duration': 10}], 'version': 29} +[INFO] [SignageApp] python_functions: Finished load_local_playlist function successfully. +[INFO] [SignageApp] Found fallback playlist with 2 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/api/playlists with params: {'hostname': 'tv-terasa', 'quickconnect_code': '8887779'} +[INFO] [SignageApp] Server response: {'hashed_quickconnect': '$2b$12$UQzlEHNWudAB4P08Le3YJeWHrZHJkWL44kRQpZ53kt.fDLTcrPzGm', 'playlist': [{'duration': 10, 'file_name': 'Cindrel_1.jpg', 'url': 'http://digi-signage.moto-adv.com/media/Cindrel_1.jpg'}, {'duration': 10, 'file_name': 'trans_cindrel_4.jpg', 'url': 'http://digi-signage.moto-adv.com/media/trans_cindrel_4.jpg'}], 'playlist_version': 29} +[INFO] [SignageApp] Fetched updated playlist from server. +[INFO] [SignageApp] python_functions: Updated playlist version in app_config.txt to 29. +[INFO] [SignageApp] Server playlist found with 2 items, version 29 +[INFO] [SignageApp] python_functions: Starting media file download... +[INFO] [SignageApp] python_functions: File Cindrel_1.jpg already exists. Skipping download. +[INFO] [SignageApp] python_functions: File trans_cindrel_4.jpg already exists. Skipping download. +[INFO] [SignageApp] python_functions: Starting save_local_playlist function. +[INFO] [SignageApp] python_functions: Updated local playlist with server data. +[INFO] [SignageApp] python_functions: Finished save_local_playlist function. +[INFO] [SignageApp] python_functions: Finished media file download and updated local playlist. +[INFO] [SignageApp] python_functions: Updated playlist version in app_config.txt to 29. +[INFO] [SignageApp] python_functions: Starting load_local_playlist function. +[INFO] [SignageApp] python_functions: Local playlist loaded: {'playlist': [{'file_name': 'Cindrel_1.jpg', 'url': 'static/resurse/Cindrel_1.jpg', 'duration': 10}, {'file_name': 'trans_cindrel_4.jpg', 'url': 'static/resurse/trans_cindrel_4.jpg', 'duration': 10}], 'version': 29} +[INFO] [SignageApp] python_functions: Finished load_local_playlist function successfully. +[INFO] [SignageApp] Successfully loaded 2 items from server +[INFO] [SignageApp] Loaded playlist with 2 items +[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_local_playlist function. +[INFO] [SignageApp] [MAIN] About to show splash screen: /home/pi/Desktop/tkinter_player/tkinter_app/resources/intro1.mp4 +[INFO] [SignageApp] [SplashScreen] Running splash as standalone VLC subprocess: /home/pi/Desktop/tkinter_player/tkinter_app/resources/intro1.mp4 +[INFO] [SignageApp] [SplashScreen] Launching: cvlc --fullscreen --no-osd --no-video-title-show --play-and-exit --quiet /home/pi/Desktop/tkinter_player/tkinter_app/resources/intro1.mp4 +[INFO] [SignageApp] python_functions: Local playlist loaded: {'playlist': [{'file_name': 'Cindrel_1.jpg', 'url': 'static/resurse/Cindrel_1.jpg', 'duration': 10}, {'file_name': 'trans_cindrel_4.jpg', 'url': 'static/resurse/trans_cindrel_4.jpg', 'duration': 10}], 'version': 29} +[INFO] [SignageApp] python_functions: Finished load_local_playlist function successfully. +[INFO] [SignageApp] Found fallback playlist with 2 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/api/playlists with params: {'hostname': 'tv-terasa', 'quickconnect_code': '8887779'} +[INFO] [SignageApp] Server response: {'hashed_quickconnect': '$2b$12$UQzlEHNWudAB4P08Le3YJeWHrZHJkWL44kRQpZ53kt.fDLTcrPzGm', 'playlist': [{'duration': 10, 'file_name': 'Cindrel_1.jpg', 'url': 'http://digi-signage.moto-adv.com/media/Cindrel_1.jpg'}, {'duration': 10, 'file_name': 'trans_cindrel_4.jpg', 'url': 'http://digi-signage.moto-adv.com/media/trans_cindrel_4.jpg'}], 'playlist_version': 29} +[INFO] [SignageApp] Fetched updated playlist from server. +[INFO] [SignageApp] python_functions: Updated playlist version in app_config.txt to 29. +[INFO] [SignageApp] Server playlist found with 2 items, version 29 +[INFO] [SignageApp] python_functions: Starting media file download... +[INFO] [SignageApp] python_functions: File Cindrel_1.jpg already exists. Skipping download. +[INFO] [SignageApp] python_functions: File trans_cindrel_4.jpg already exists. Skipping download. +[INFO] [SignageApp] python_functions: Starting save_local_playlist function. +[INFO] [SignageApp] python_functions: Updated local playlist with server data. +[INFO] [SignageApp] python_functions: Finished save_local_playlist function. +[INFO] [SignageApp] python_functions: Finished media file download and updated local playlist. +[INFO] [SignageApp] python_functions: Updated playlist version in app_config.txt to 29. +[INFO] [SignageApp] python_functions: Starting load_local_playlist function. +[INFO] [SignageApp] python_functions: Local playlist loaded: {'playlist': [{'file_name': 'Cindrel_1.jpg', 'url': 'static/resurse/Cindrel_1.jpg', 'duration': 10}, {'file_name': 'trans_cindrel_4.jpg', 'url': 'static/resurse/trans_cindrel_4.jpg', 'duration': 10}], 'version': 29} +[INFO] [SignageApp] python_functions: Finished load_local_playlist function successfully. +[INFO] [SignageApp] Successfully loaded 2 items from server +[INFO] [SignageApp] [SplashScreen] VLC splash finished. +[INFO] [SignageApp] [MAIN] splash.show() called, entering mainloop... +[INFO] [SignageApp] [MAIN] Splash finished, waiting for playlist... +[INFO] [SignageApp] [MAIN] Playlist loaded: [{'file_name': 'Cindrel_1.jpg', 'url': 'static/resurse/Cindrel_1.jpg', 'duration': 10}, {'file_name': 'trans_cindrel_4.jpg', 'url': 'static/resurse/trans_cindrel_4.jpg', 'duration': 10}] +[INFO] [SignageApp] Playing media: Cindrel_1.jpg from /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/Cindrel_1.jpg +2025-08-24 00:01:21 - STARTED: Cindrel_1.jpg +[INFO] [SignageApp] Successfully displayed image: Cindrel_1.jpg (Original: (4096, 3072), Screen: 1920x1080, Mode: fit, Offset: (240, 0)) +[INFO] [SignageApp] [MAIN] Player UI and playback started. +[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_local_playlist function. +[INFO] [SignageApp] [MAIN] About to show splash screen: /home/pi/Desktop/tkinter_player/tkinter_app/resources/intro1.mp4 +[INFO] [SignageApp] python_functions: Local playlist loaded: {'playlist': [{'file_name': 'Cindrel_1.jpg', 'url': 'static/resurse/Cindrel_1.jpg', 'duration': 10}, {'file_name': 'trans_cindrel_4.jpg', 'url': 'static/resurse/trans_cindrel_4.jpg', 'duration': 10}], 'version': 29} +[INFO] [SignageApp] [SplashScreen] Running splash as standalone VLC subprocess: /home/pi/Desktop/tkinter_player/tkinter_app/resources/intro1.mp4 +[INFO] [SignageApp] python_functions: Finished load_local_playlist function successfully. +[INFO] [SignageApp] Found fallback playlist with 2 items +[INFO] [SignageApp] python_functions: Starting load_config function. +[INFO] [SignageApp] [SplashScreen] Launching: cvlc --fullscreen --no-osd --no-video-title-show --play-and-exit --quiet /home/pi/Desktop/tkinter_player/tkinter_app/resources/intro1.mp4 +[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/api/playlists with params: {'hostname': 'tv-terasa', 'quickconnect_code': '8887779'} +[INFO] [SignageApp] Server response: {'hashed_quickconnect': '$2b$12$UQzlEHNWudAB4P08Le3YJeWHrZHJkWL44kRQpZ53kt.fDLTcrPzGm', 'playlist': [{'duration': 10, 'file_name': 'Cindrel_1.jpg', 'url': 'http://digi-signage.moto-adv.com/media/Cindrel_1.jpg'}, {'duration': 10, 'file_name': 'trans_cindrel_4.jpg', 'url': 'http://digi-signage.moto-adv.com/media/trans_cindrel_4.jpg'}], 'playlist_version': 29} +[INFO] [SignageApp] Fetched updated playlist from server. +[INFO] [SignageApp] python_functions: Updated playlist version in app_config.txt to 29. +[INFO] [SignageApp] Server playlist found with 2 items, version 29 +[INFO] [SignageApp] python_functions: Starting media file download... +[INFO] [SignageApp] python_functions: File Cindrel_1.jpg already exists. Skipping download. +[INFO] [SignageApp] python_functions: File trans_cindrel_4.jpg already exists. Skipping download. +[INFO] [SignageApp] python_functions: Starting save_local_playlist function. +[INFO] [SignageApp] python_functions: Updated local playlist with server data. +[INFO] [SignageApp] python_functions: Finished save_local_playlist function. +[INFO] [SignageApp] python_functions: Finished media file download and updated local playlist. +[INFO] [SignageApp] python_functions: Updated playlist version in app_config.txt to 29. +[INFO] [SignageApp] python_functions: Starting load_local_playlist function. +[INFO] [SignageApp] python_functions: Local playlist loaded: {'playlist': [{'file_name': 'Cindrel_1.jpg', 'url': 'static/resurse/Cindrel_1.jpg', 'duration': 10}, {'file_name': 'trans_cindrel_4.jpg', 'url': 'static/resurse/trans_cindrel_4.jpg', 'duration': 10}], 'version': 29} +[INFO] [SignageApp] python_functions: Finished load_local_playlist function successfully. +[INFO] [SignageApp] Successfully loaded 2 items from server +[INFO] [SignageApp] [SplashScreen] VLC splash finished. +[INFO] [SignageApp] [MAIN] splash.show() called, entering mainloop... +[INFO] [SignageApp] [MAIN] Splash finished, waiting for playlist... +[INFO] [SignageApp] [MAIN] Playlist loaded: [{'file_name': 'Cindrel_1.jpg', 'url': 'static/resurse/Cindrel_1.jpg', 'duration': 10}, {'file_name': 'trans_cindrel_4.jpg', 'url': 'static/resurse/trans_cindrel_4.jpg', 'duration': 10}] +[INFO] [SignageApp] Playing media: Cindrel_1.jpg from /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/Cindrel_1.jpg +2025-08-24 00:04:00 - STARTED: Cindrel_1.jpg +[INFO] [SignageApp] Successfully displayed image: Cindrel_1.jpg (Original: (4096, 3072), Screen: 1920x1080, Mode: fit, Offset: (240, 0)) +[INFO] [SignageApp] [MAIN] Player UI and playback started. +[INFO] [SignageApp] Playing media: trans_cindrel_4.jpg from /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/trans_cindrel_4.jpg +2025-08-24 00:04:11 - STARTED: trans_cindrel_4.jpg +[INFO] [SignageApp] Successfully displayed image: trans_cindrel_4.jpg (Original: (4000, 3000), Screen: 1920x1018, Mode: fit, Offset: (281, 0)) +[INFO] [SignageApp] Playing media: Cindrel_1.jpg from /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/Cindrel_1.jpg +2025-08-24 00:04:23 - STARTED: Cindrel_1.jpg +[INFO] [SignageApp] Successfully displayed image: Cindrel_1.jpg (Original: (4096, 3072), Screen: 1920x1018, Mode: fit, Offset: (281, 0)) +[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_local_playlist function. +[INFO] [SignageApp] [MAIN] About to show splash screen: /home/pi/Desktop/tkinter_player/tkinter_app/resources/intro1.mp4 +[INFO] [SignageApp] [SplashScreen] Running splash as standalone VLC subprocess: /home/pi/Desktop/tkinter_player/tkinter_app/resources/intro1.mp4 +[INFO] [SignageApp] python_functions: Local playlist loaded: {'playlist': [{'file_name': 'Cindrel_1.jpg', 'url': 'static/resurse/Cindrel_1.jpg', 'duration': 10}, {'file_name': 'trans_cindrel_4.jpg', 'url': 'static/resurse/trans_cindrel_4.jpg', 'duration': 10}], 'version': 29} +[INFO] [SignageApp] [SplashScreen] Launching: cvlc --fullscreen --no-osd --no-video-title-show --play-and-exit --quiet /home/pi/Desktop/tkinter_player/tkinter_app/resources/intro1.mp4 +[INFO] [SignageApp] python_functions: Finished load_local_playlist function successfully. +[INFO] [SignageApp] Found fallback playlist with 2 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/api/playlists with params: {'hostname': 'tv-terasa', 'quickconnect_code': '8887779'} +[INFO] [SignageApp] Server response: {'hashed_quickconnect': '$2b$12$UQzlEHNWudAB4P08Le3YJeWHrZHJkWL44kRQpZ53kt.fDLTcrPzGm', 'playlist': [{'duration': 10, 'file_name': 'Cindrel_1.jpg', 'url': 'http://digi-signage.moto-adv.com/media/Cindrel_1.jpg'}, {'duration': 10, 'file_name': 'trans_cindrel_4.jpg', 'url': 'http://digi-signage.moto-adv.com/media/trans_cindrel_4.jpg'}], 'playlist_version': 29} +[INFO] [SignageApp] Fetched updated playlist from server. +[INFO] [SignageApp] python_functions: Updated playlist version in app_config.txt to 29. +[INFO] [SignageApp] Server playlist found with 2 items, version 29 +[INFO] [SignageApp] python_functions: Starting media file download... +[INFO] [SignageApp] python_functions: File Cindrel_1.jpg already exists. Skipping download. +[INFO] [SignageApp] python_functions: File trans_cindrel_4.jpg already exists. Skipping download. +[INFO] [SignageApp] python_functions: Starting save_local_playlist function. +[INFO] [SignageApp] python_functions: Updated local playlist with server data. +[INFO] [SignageApp] python_functions: Finished save_local_playlist function. +[INFO] [SignageApp] python_functions: Finished media file download and updated local playlist. +[INFO] [SignageApp] python_functions: Updated playlist version in app_config.txt to 29. +[INFO] [SignageApp] python_functions: Starting load_local_playlist function. +[INFO] [SignageApp] python_functions: Local playlist loaded: {'playlist': [{'file_name': 'Cindrel_1.jpg', 'url': 'static/resurse/Cindrel_1.jpg', 'duration': 10}, {'file_name': 'trans_cindrel_4.jpg', 'url': 'static/resurse/trans_cindrel_4.jpg', 'duration': 10}], 'version': 29} +[INFO] [SignageApp] python_functions: Finished load_local_playlist function successfully. +[INFO] [SignageApp] Successfully loaded 2 items from server +[INFO] [SignageApp] [SplashScreen] VLC splash finished. +[INFO] [SignageApp] [MAIN] splash.show() called, entering mainloop... +[INFO] [SignageApp] [MAIN] Splash finished, waiting for playlist... +[INFO] [SignageApp] [MAIN] Playlist loaded: [{'file_name': 'Cindrel_1.jpg', 'url': 'static/resurse/Cindrel_1.jpg', 'duration': 10}, {'file_name': 'trans_cindrel_4.jpg', 'url': 'static/resurse/trans_cindrel_4.jpg', 'duration': 10}] +[INFO] [SignageApp] Playing media: Cindrel_1.jpg from /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/Cindrel_1.jpg +2025-08-24 00:06:44 - STARTED: Cindrel_1.jpg +[INFO] [SignageApp] Successfully displayed image: Cindrel_1.jpg (Original: (4096, 3072), Screen: 1920x1080, Mode: fit, Offset: (240, 0)) +[INFO] [SignageApp] [MAIN] Player UI and playback started. +[INFO] [SignageApp] Playing media: trans_cindrel_4.jpg from /home/pi/Desktop/tkinter_player/tkinter_app/src/static/resurse/trans_cindrel_4.jpg +2025-08-24 00:06:56 - STARTED: trans_cindrel_4.jpg +[INFO] [SignageApp] Successfully displayed image: trans_cindrel_4.jpg (Original: (4000, 3000), Screen: 1920x1018, Mode: fit, Offset: (281, 0)) diff --git a/tkinter_app/src/__pycache__/media_playback_controller.cpython-311.pyc b/tkinter_app/src/__pycache__/media_playback_controller.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0011a31851900e032fd8ea1176292b1888c84e9c GIT binary patch literal 12514 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 A3jhEB literal 0 HcmV?d00001 diff --git a/tkinter_app/src/__pycache__/player_app.cpython-311.pyc b/tkinter_app/src/__pycache__/player_app.cpython-311.pyc index dacaa8b54b1fc1aed8dfcf8fed5b9e3378c681e3..b73ee68461c4f5193d24ca565d679d74aa0d9c95 100644 GIT binary patch delta 5799 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 D8#biD delta 12093 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 F{{uhVER_HN diff --git a/tkinter_app/src/main.py b/tkinter_app/src/main.py index e3984ae..e573c59 100644 --- a/tkinter_app/src/main.py +++ b/tkinter_app/src/main.py @@ -11,25 +11,43 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__))) from logging_config import Logger -from player_app import SimpleMediaPlayerApp +from player_ui import PlayerUI +from media_playback_controller import MediaPlaybackController from splash_screen import SplashScreen from playlist_manager import PlaylistManager +from threading import Thread if __name__ == "__main__": import tkinter as tk root = tk.Tk() - # Play splash screen first, then start player playlist_manager = PlaylistManager() playlist_manager.fetch_playlist() # Start fetching playlist in parallel with splash intro_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'resources', 'intro1.mp4') + preload_result = {} + def preload_first_media(playlist): + if playlist and len(playlist) > 0: + first_item = playlist[0] + file_path = first_item.get('url', '') + if file_path and os.path.exists(file_path): + try: + from PIL import Image + if file_path.lower().endswith(('.jpg', '.jpeg', '.png', '.bmp', '.gif')): + img = Image.open(file_path) + img.load() # Force decode + preload_result['image'] = img + except Exception as e: + Logger.warning(f"[MAIN] Preload failed: {e}") Logger.info(f"[MAIN] About to show splash screen: {intro_path}") def start_player(): Logger.info("[MAIN] Splash finished, waiting for playlist...") playlist = playlist_manager.wait_for_playlist() Logger.info(f"[MAIN] Playlist loaded: {playlist}") - player = SimpleMediaPlayerApp(root) - player.playlist = playlist or [] - player.run() + Thread(target=preload_first_media, args=(playlist,), daemon=True).start() + ui = PlayerUI(root) + playback = MediaPlaybackController(app=None, ui=ui) + playback.set_playlist(playlist or []) + playback.play_current_media() + Logger.info("[MAIN] Player UI and playback started.") splash = SplashScreen(root, intro_path, duration=10) splash.show(on_finish=start_player) Logger.info("[MAIN] splash.show() called, entering mainloop...") diff --git a/tkinter_app/src/player_app.py b/tkinter_app/src/player_app.py index ef6a0a0..02cbc4f 100644 --- a/tkinter_app/src/player_app.py +++ b/tkinter_app/src/player_app.py @@ -50,6 +50,7 @@ class SimpleMediaPlayerApp: self.playlist = [] self.current_index = 0 self.scaling_mode = 'fit' + self.auto_advance_timer = None self.hide_controls_timer = None self.settings_window = None # UI extraction @@ -173,6 +174,12 @@ class SimpleMediaPlayerApp: def cancel_timers(self): self.playback.cancel_timers() + def show_no_content_message(self): + self.playback.show_no_content_message() + + def log_event(self, file_name, event): + self.playback.log_event(file_name, event) + def show_controls(self): if self.ui.control_frame: self.ui.control_frame.place(relx=0.98, rely=0.98, anchor='se')