Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
M
MBetterc
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Mbetter
MBetterc
Commits
a596debf
Commit
a596debf
authored
Dec 03, 2025
by
Stefy Lanza (nextime / spora )
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
- Removed native overlay
parent
d697940f
Changes
14
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
586 additions
and
794 deletions
+586
-794
PyQt6_UPGRADE_SUMMARY.md
PyQt6_UPGRADE_SUMMARY.md
+9
-5
main.py
main.py
+0
-6
client.py
mbetterclient/api_client/client.py
+7
-7
settings.py
mbetterclient/config/settings.py
+0
-1
application.py
mbetterclient/core/application.py
+0
-2
match_timer.py
mbetterclient/core/match_timer.py
+1
-1
screen_cast.py
mbetterclient/core/screen_cast.py
+5
-5
thread_manager.py
mbetterclient/core/thread_manager.py
+6
-5
__init__.py
mbetterclient/qt_player/__init__.py
+0
-3
overlay_engine.py
mbetterclient/qt_player/overlay_engine.py
+0
-492
player.py
mbetterclient/qt_player/player.py
+248
-224
template_watcher.py
mbetterclient/qt_player/template_watcher.py
+18
-9
app.py
mbetterclient/web_dashboard/app.py
+9
-8
overlay.js
mbetterclient/web_dashboard/static/overlay.js
+283
-26
No files found.
PyQt6_UPGRADE_SUMMARY.md
View file @
a596debf
...
...
@@ -33,10 +33,11 @@ Successfully replaced the PyQt5 video player implementation with a comprehensive
-
**Responsive Design**
: Automatic scaling for different resolutions
-
**GSAP-ready Structure**
: Animation framework integration support
### 3. Legacy Compatibility (mbetterclient/qt_player/overlay_engine.py)
**UPDATED**
PyQt5 → PyQt6 imports and constants for compatibility:
-
Updated Qt enums to PyQt6 format (Qt.AlignLeft → Qt.AlignmentFlag.AlignLeft)
-
Maintained backward compatibility for any remaining legacy code
### 3. Legacy Removal (overlay_engine.py)
**REMOVED**
the legacy native overlay engine entirely:
-
The native Qt overlay implementation was replaced by the superior QWebEngineView system
-
All overlay functionality now uses HTML/CSS/JavaScript templates exclusively
-
Removed OverlayEngine and OverlayRenderer classes as they are no longer needed
### 4. Message Bus Integration
**ENHANCED**
message handling for complete thread communication:
...
...
@@ -135,7 +136,10 @@ message_bus.publish(overlay_message)
### Modified Files:
-
`mbetterclient/qt_player/player.py`
-
**COMPLETELY REPLACED**
with PyQt6 implementation
-
`mbetterclient/qt_player/overlay_engine.py`
- Updated PyQt5 → PyQt6 imports
-
`mbetterclient/qt_player/__init__.py`
- Removed legacy overlay engine imports
### Removed Files:
-
`mbetterclient/qt_player/overlay_engine.py`
- Legacy native overlay implementation removed
### Unchanged Files:
-
`mbetterclient/core/application.py`
- Works seamlessly with new implementation
...
...
main.py
View file @
a596debf
...
...
@@ -173,11 +173,6 @@ Examples:
help
=
'Disable web dashboard (PyQt interface only)'
)
parser
.
add_argument
(
'--native-overlay'
,
action
=
'store_true'
,
help
=
'Use native Qt overlay instead of QWebEngineView (prevents freezing on some systems)'
)
# Screen cast options
parser
.
add_argument
(
...
...
@@ -275,7 +270,6 @@ def main():
settings
.
debug_overlay
=
args
.
debug_overlay
settings
.
enable_qt
=
not
args
.
no_qt
settings
.
enable_web
=
not
args
.
no_web
settings
.
qt
.
use_native_overlay
=
args
.
native_overlay
# Timer settings
if
args
.
start_timer
is
not
None
:
...
...
mbetterclient/api_client/client.py
View file @
a596debf
...
...
@@ -922,27 +922,27 @@ class APIClient(ThreadedComponent):
self
.
message_bus
.
publish
(
ready_message
)
# Main execution loop
while
self
.
running
:
while
self
.
running
and
not
self
.
shutdown_event
.
is_set
()
:
try
:
# Update heartbeat at the start of each loop
self
.
heartbeat
()
# Process messages
message
=
self
.
message_bus
.
get_message
(
self
.
name
,
timeout
=
1.0
)
if
message
:
self
.
_process_message
(
message
)
# Update heartbeat before potentially long operations
self
.
heartbeat
()
# Execute scheduled API requests
self
.
_execute_scheduled_requests
()
# Update heartbeat after operations
self
.
heartbeat
()
time
.
sleep
(
1.0
)
except
Exception
as
e
:
logger
.
error
(
f
"APIClient run loop error: {e}"
)
# Update heartbeat even in error cases
...
...
mbetterclient/config/settings.py
View file @
a596debf
...
...
@@ -228,7 +228,6 @@ class QtConfig:
overlay_enabled
:
bool
=
True
default_template
:
str
=
"news_template"
overlay_opacity
:
float
=
0.9
use_native_overlay
:
bool
=
False
# Use native Qt widgets instead of QWebEngineView
# Performance settings
hardware_acceleration
:
bool
=
True
...
...
mbetterclient/core/application.py
View file @
a596debf
...
...
@@ -133,8 +133,6 @@ class MbetterClientApplication:
stored_settings
.
enable_web
=
self
.
settings
.
enable_web
stored_settings
.
enable_screen_cast
=
self
.
settings
.
enable_screen_cast
# Preserve screen cast setting
# Preserve command line Qt overlay setting
stored_settings
.
qt
.
use_native_overlay
=
self
.
settings
.
qt
.
use_native_overlay
# Preserve command line debug settings
stored_settings
.
debug_overlay
=
self
.
settings
.
debug_overlay
...
...
mbetterclient/core/match_timer.py
View file @
a596debf
...
...
@@ -63,7 +63,7 @@ class MatchTimerComponent(ThreadedComponent):
"""Main timer loop"""
logger
.
info
(
"MatchTimer component started"
)
while
self
.
running
:
while
self
.
running
and
not
self
.
shutdown_event
.
is_set
()
:
try
:
# Process any pending messages first
message
=
self
.
message_bus
.
get_message
(
self
.
name
,
timeout
=
0.1
)
...
...
mbetterclient/core/screen_cast.py
View file @
a596debf
...
...
@@ -183,21 +183,21 @@ class ScreenCastComponent(ThreadedComponent):
self
.
_connect_chromecast
()
# Main loop - monitor and restart capture if needed
while
self
.
running
:
while
self
.
running
and
not
self
.
shutdown_event
.
is_set
()
:
try
:
# Process messages
message
=
self
.
message_bus
.
get_message
(
self
.
name
,
timeout
=
1.0
)
if
message
:
self
.
_process_message
(
message
)
# Check capture health
self
.
_check_capture_health
()
# Update heartbeat
self
.
heartbeat
()
time
.
sleep
(
1.0
)
except
Exception
as
e
:
logger
.
error
(
f
"ScreenCast run loop error: {e}"
)
time
.
sleep
(
1.0
)
...
...
mbetterclient/core/thread_manager.py
View file @
a596debf
...
...
@@ -233,10 +233,11 @@ class ThreadManager:
def
stop_all
(
self
,
timeout
:
float
=
10.0
)
->
bool
:
"""Stop all components"""
logger
.
info
(
"Stopping all components..."
)
success
=
True
stop_timeout
=
timeout
/
max
(
len
(
self
.
components
),
1
)
# Distribute timeout
# Use at least 8 seconds per component, but distribute total timeout
stop_timeout
=
max
(
timeout
/
max
(
len
(
self
.
components
),
1
),
8.0
)
with
self
.
_lock
:
for
name
,
component
in
self
.
components
.
items
():
try
:
...
...
@@ -248,12 +249,12 @@ class ThreadManager:
except
Exception
as
e
:
logger
.
error
(
f
"Exception stopping component {name}: {e}"
)
success
=
False
if
success
:
logger
.
info
(
"All components stopped successfully"
)
else
:
logger
.
warning
(
"Some components failed to stop cleanly"
)
return
success
def
restart_component
(
self
,
name
:
str
,
timeout
:
float
=
5.0
)
->
bool
:
...
...
mbetterclient/qt_player/__init__.py
View file @
a596debf
...
...
@@ -3,13 +3,10 @@ PyQt video player with overlay templates for MbetterClient
"""
from
.player
import
QtVideoPlayer
from
.overlay_engine
import
OverlayEngine
,
OverlayRenderer
from
.templates
import
TemplateManager
,
NewsTemplate
__all__
=
[
'QtVideoPlayer'
,
'OverlayEngine'
,
'OverlayRenderer'
,
'TemplateManager'
,
'NewsTemplate'
]
\ No newline at end of file
mbetterclient/qt_player/overlay_engine.py
deleted
100644 → 0
View file @
d697940f
This diff is collapsed.
Click to expand it.
mbetterclient/qt_player/player.py
View file @
a596debf
This diff is collapsed.
Click to expand it.
mbetterclient/qt_player/template_watcher.py
View file @
a596debf
...
...
@@ -169,18 +169,18 @@ class TemplateWatcher(ThreadedComponent):
self
.
_scan_existing_templates
()
# Message processing loop
while
self
.
running
:
while
self
.
running
and
not
self
.
shutdown_event
.
is_set
()
:
try
:
# Process messages
message
=
self
.
message_bus
.
get_message
(
self
.
name
,
timeout
=
1.0
)
if
message
:
self
.
_process_message
(
message
)
# Update heartbeat
self
.
heartbeat
()
time
.
sleep
(
0.1
)
except
Exception
as
e
:
logger
.
error
(
f
"TemplateWatcher run loop error: {e}"
)
time
.
sleep
(
1.0
)
...
...
@@ -199,14 +199,23 @@ class TemplateWatcher(ThreadedComponent):
"""Shutdown template watcher"""
try
:
logger
.
info
(
"Shutting down TemplateWatcher..."
)
if
self
.
observer
:
# Unschedule all handlers
for
handler
in
self
.
event_handlers
:
try
:
self
.
observer
.
unschedule
(
handler
)
except
Exception
:
pass
self
.
event_handlers
.
clear
()
self
.
observer
.
stop
()
self
.
observer
.
join
()
try
:
self
.
observer
.
join
(
timeout
=
2.0
)
except
Exception
:
pass
self
.
observer
=
None
self
.
event_handler
=
None
except
Exception
as
e
:
logger
.
error
(
f
"TemplateWatcher shutdown error: {e}"
)
...
...
mbetterclient/web_dashboard/app.py
View file @
a596debf
...
...
@@ -432,25 +432,25 @@ class WebDashboard(ThreadedComponent):
server_thread
.
start
()
# Message processing loop
while
self
.
running
:
while
self
.
running
and
not
self
.
shutdown_event
.
is_set
()
:
try
:
# Process messages
message
=
self
.
message_bus
.
get_message
(
self
.
name
,
timeout
=
1.0
)
if
message
:
self
.
_process_message
(
message
)
# Update heartbeat
self
.
heartbeat
()
time
.
sleep
(
0.1
)
except
Exception
as
e
:
logger
.
error
(
f
"WebDashboard run loop error: {e}"
)
time
.
sleep
(
1.0
)
# Wait for server thread
if
server_thread
.
is_alive
():
server_thread
.
join
(
timeout
=
5
.0
)
# Wait for server thread
to finish (with timeout since it's daemon)
if
server_thread
and
server_thread
.
is_alive
():
server_thread
.
join
(
timeout
=
2
.0
)
except
Exception
as
e
:
logger
.
error
(
f
"WebDashboard run failed: {e}"
)
...
...
@@ -527,7 +527,8 @@ class WebDashboard(ThreadedComponent):
if
self
.
server
:
logger
.
info
(
"Shutting down HTTP server..."
)
self
.
server
.
shutdown
()
logger
.
info
(
"HTTP server shutdown initiated"
)
self
.
server
.
server_close
()
logger
.
info
(
"HTTP server shutdown completed"
)
# Note: SocketIO connections will be closed when the server shuts down
# No explicit SocketIO shutdown needed as it's handled by the WSGI server
...
...
mbetterclient/web_dashboard/static/overlay.js
View file @
a596debf
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment