Fixed Wrong Names
This commit is contained in:
1 parent
348a6c6cfc
commit
5d9db0a66f
2 files changed
+100
-48
No files matched your search
@@ -63,6 +63,7 @@ def cleanup_old_cache_files():
|
||||
return
|
||||
|
||||
import time
|
||||
|
||||
current_time = time.time()
|
||||
# Clean files older than 2 hours (more aggressive)
|
||||
two_hours_ago = current_time - (2 * 60 * 60)
|
||||
@@ -86,37 +87,40 @@ def get_artwork_cached(url: str) -> Optional[str]:
|
||||
"""Get artwork with memory-efficient caching."""
|
||||
if not url:
|
||||
return None
|
||||
|
||||
|
||||
# Check memory cache first
|
||||
if url in _artwork_cache:
|
||||
return _artwork_cache[url]
|
||||
|
||||
|
||||
# Clean cache if too large
|
||||
cleanup_artwork_cache()
|
||||
|
||||
|
||||
try:
|
||||
# Create cache directory if it doesn't exist
|
||||
os.makedirs(CACHE_DIR, exist_ok=True)
|
||||
|
||||
|
||||
# Generate cache filename
|
||||
safe_filename = re.sub(r'[^\w\-_.]', '_', urllib.parse.urlparse(url).path.split('/')[-1])
|
||||
safe_filename = re.sub(
|
||||
r"[^\w\-_.]", "_", urllib.parse.urlparse(url).path.split("/")[-1]
|
||||
)
|
||||
if not safe_filename:
|
||||
safe_filename = f"artwork_{hash(url)}"
|
||||
|
||||
|
||||
cache_file = os.path.join(CACHE_DIR, safe_filename)
|
||||
|
||||
|
||||
# Check if cached file exists and is recent (within 2 hours)
|
||||
if os.path.exists(cache_file):
|
||||
import time
|
||||
|
||||
if time.time() - os.path.getmtime(cache_file) < 7200: # 2 hours
|
||||
_artwork_cache[url] = cache_file
|
||||
return cache_file
|
||||
|
||||
|
||||
# Download and cache
|
||||
urllib.request.urlretrieve(url, cache_file)
|
||||
_artwork_cache[url] = cache_file
|
||||
return cache_file
|
||||
|
||||
|
||||
except Exception as e:
|
||||
logger.warning(f"Failed to cache artwork from {url}: {e}")
|
||||
return None
|
||||
@@ -198,47 +202,49 @@ class EmbeddedExpandedPlayer(Box):
|
||||
def destroy(self):
|
||||
"""Clean up resources and prevent memory leaks"""
|
||||
logger.debug("🗑️ EmbeddedExpandedPlayer cleanup starting")
|
||||
|
||||
|
||||
try:
|
||||
# Destroy player content (PlayerBoxStack)
|
||||
if hasattr(self, 'player_content') and hasattr(self.player_content, "destroy"):
|
||||
if hasattr(self, "player_content") and hasattr(
|
||||
self.player_content, "destroy"
|
||||
):
|
||||
self.player_content.destroy()
|
||||
|
||||
|
||||
# Clean up back button
|
||||
if hasattr(self, 'back_button') and hasattr(self.back_button, "destroy"):
|
||||
if hasattr(self, "back_button") and hasattr(self.back_button, "destroy"):
|
||||
self.back_button.destroy()
|
||||
|
||||
|
||||
# Clean up any other widgets we might have
|
||||
for child in list(self.get_children()):
|
||||
try:
|
||||
child.destroy()
|
||||
except Exception as e:
|
||||
logger.warning(f"Failed to destroy child widget: {e}")
|
||||
|
||||
|
||||
# Clean up keybinding if it was added
|
||||
if hasattr(self, '_keybinding_added') and self._keybinding_added:
|
||||
if hasattr(self, "_keybinding_added") and self._keybinding_added:
|
||||
try:
|
||||
if hasattr(self.control_center, "remove_keybinding"):
|
||||
self.control_center.remove_keybinding("Escape")
|
||||
except Exception as e:
|
||||
logger.warning(f"Failed to remove keybinding: {e}")
|
||||
|
||||
|
||||
# Aggressively clean global caches
|
||||
global _widget_cache, _artwork_cache
|
||||
_widget_cache.clear()
|
||||
_artwork_cache.clear()
|
||||
logger.debug("🗑️ Cleared global widget and artwork caches")
|
||||
|
||||
|
||||
# Clear references
|
||||
if hasattr(self, 'control_center'):
|
||||
if hasattr(self, "control_center"):
|
||||
self.control_center = None
|
||||
if hasattr(self, 'mpris_manager'):
|
||||
if hasattr(self, "mpris_manager"):
|
||||
self.mpris_manager = None
|
||||
|
||||
|
||||
# Force garbage collection
|
||||
gc.collect()
|
||||
logger.debug("🗑️ EmbeddedExpandedPlayer cleanup completed")
|
||||
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error during EmbeddedExpandedPlayer cleanup: {e}")
|
||||
finally:
|
||||
@@ -248,20 +254,22 @@ class EmbeddedExpandedPlayer(Box):
|
||||
"""Light cleanup for EmbeddedExpandedPlayer reuse"""
|
||||
try:
|
||||
logger.debug("🧹 EmbeddedExpandedPlayer light cleanup starting")
|
||||
|
||||
|
||||
# Only clean up the player content lightly
|
||||
if hasattr(self, 'player_content') and hasattr(self.player_content, '_periodic_cleanup'):
|
||||
if hasattr(self, "player_content") and hasattr(
|
||||
self.player_content, "_periodic_cleanup"
|
||||
):
|
||||
self.player_content._periodic_cleanup()
|
||||
|
||||
|
||||
# Clean global caches but don't destroy core functionality
|
||||
global _artwork_cache
|
||||
_artwork_cache.clear()
|
||||
|
||||
|
||||
# Light garbage collection
|
||||
gc.collect()
|
||||
|
||||
|
||||
logger.debug("🧹 EmbeddedExpandedPlayer light cleanup completed")
|
||||
|
||||
|
||||
except Exception as e:
|
||||
logger.warning(f"Error during EmbeddedExpandedPlayer light cleanup: {e}")
|
||||
|
||||
@@ -312,20 +320,24 @@ class PlayerBoxStack(Box):
|
||||
|
||||
# Process existing players
|
||||
for player in self.mpris_manager.players: # type: ignore
|
||||
logger.info(f"[PLAYER MANAGER] player found: {player.get_property('player-name')}")
|
||||
logger.info(
|
||||
f"[PLAYER MANAGER] player found: {player.get_property('player-name')}"
|
||||
)
|
||||
self.on_new_player(self.mpris_manager, player)
|
||||
|
||||
# Schedule periodic memory cleanup and store source ID
|
||||
self._cleanup_source_id = GLib.timeout_add_seconds(300, self._periodic_cleanup) # Every 5 minutes
|
||||
self._cleanup_source_id = GLib.timeout_add_seconds(
|
||||
300, self._periodic_cleanup
|
||||
) # Every 5 minutes
|
||||
|
||||
def _periodic_cleanup(self):
|
||||
"""Light cleanup for widget reuse - preserve functionality."""
|
||||
try:
|
||||
logger.debug("Starting light expanded player cleanup for reuse")
|
||||
|
||||
|
||||
# Clean artwork cache to reduce memory
|
||||
cleanup_artwork_cache()
|
||||
|
||||
|
||||
# Reset visual state but preserve connections and core functionality
|
||||
# Only clear the player widgets that can be recreated
|
||||
for widget in list(self._player_widgets.values()):
|
||||
@@ -336,39 +348,39 @@ class PlayerBoxStack(Box):
|
||||
except Exception:
|
||||
pass
|
||||
# Don't clear the _player_widgets dict - just let them be recreated
|
||||
|
||||
|
||||
# Reset stack to show no_media_box without destroying children
|
||||
try:
|
||||
if hasattr(self, 'player_stack') and hasattr(self, 'no_media_box'):
|
||||
if hasattr(self, "player_stack") and hasattr(self, "no_media_box"):
|
||||
self.player_stack.set_visible_child(self.no_media_box)
|
||||
self.current_stack_pos = 0
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
# Light garbage collection
|
||||
gc.collect()
|
||||
|
||||
|
||||
logger.debug("Light expanded player cleanup completed")
|
||||
|
||||
|
||||
except Exception as e:
|
||||
logger.warning(f"Error during light cleanup: {e}")
|
||||
|
||||
|
||||
return True # Continue timer
|
||||
|
||||
def destroy(self):
|
||||
"""Clean up resources when the widget is destroyed."""
|
||||
try:
|
||||
# Cancel any pending cleanup timer
|
||||
if hasattr(self, '_cleanup_source_id') and self._cleanup_source_id:
|
||||
if hasattr(self, "_cleanup_source_id") and self._cleanup_source_id:
|
||||
try:
|
||||
GLib.source_remove(self._cleanup_source_id)
|
||||
except Exception:
|
||||
pass # Timer may have already been removed
|
||||
|
||||
|
||||
# Disconnect all signal connections
|
||||
for obj, handler_id in self._signal_connections:
|
||||
try:
|
||||
if obj and hasattr(obj, 'disconnect'):
|
||||
if obj and hasattr(obj, "disconnect"):
|
||||
obj.disconnect(handler_id)
|
||||
except Exception as e:
|
||||
logger.warning(f"Failed to disconnect signal: {e}")
|
||||
@@ -770,7 +782,7 @@ class PlayerBox(Box):
|
||||
min_value=0,
|
||||
max_value=100,
|
||||
increments=(1, 1),
|
||||
name="macos-seek-bar",
|
||||
name="expanded-seek-bar",
|
||||
size=1,
|
||||
h_expand=True,
|
||||
)
|
||||
@@ -993,11 +1005,12 @@ class PlayerBox(Box):
|
||||
|
||||
# Cancel any ongoing downloads immediately
|
||||
self._download_cancelled = True
|
||||
|
||||
|
||||
# Cancel seek bar timer
|
||||
if self._seekbar_timer_id:
|
||||
try:
|
||||
from gi.repository import GLib
|
||||
|
||||
GLib.source_remove(self._seekbar_timer_id)
|
||||
except:
|
||||
pass
|
||||
@@ -1117,11 +1130,12 @@ class PlayerBox(Box):
|
||||
if self._seekbar_timer_id:
|
||||
try:
|
||||
from gi.repository import GLib
|
||||
|
||||
GLib.source_remove(self._seekbar_timer_id)
|
||||
except:
|
||||
pass
|
||||
self._seekbar_timer_id = None
|
||||
|
||||
|
||||
# Start new timer and store its ID
|
||||
self._seekbar_timer_id = invoke_repeater(1000, self._move_seekbar)
|
||||
|
||||
|
||||
@@ -286,8 +286,8 @@
|
||||
#control-center-menu slider {
|
||||
background: linear-gradient(135deg, #ffffff 0%, #f0f1f2 100%);
|
||||
border-color: #000;
|
||||
/* min-width: 28px; */
|
||||
/* min-height: 28px; */
|
||||
min-width: 28px;
|
||||
min-height: 28px;
|
||||
margin: -2px;
|
||||
border-radius: 50%;
|
||||
/* background-image: none; */
|
||||
@@ -657,7 +657,6 @@
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
/* macOS seek bar styling */
|
||||
|
||||
#macos-seek-bar {
|
||||
background-color: transparent;
|
||||
margin: 8px 0 4px 0;
|
||||
@@ -684,7 +683,7 @@
|
||||
border: none;
|
||||
border-radius: 20%;
|
||||
min-width: 1px;
|
||||
min-height: 10px;
|
||||
min-height: 8px;
|
||||
margin: -3px;
|
||||
box-shadow: 0 1px 3px alpha(#000, 0.3);
|
||||
transition: all 0.1s ease;
|
||||
@@ -785,3 +784,42 @@
|
||||
margin-right: 8px;
|
||||
padding-right: 8px;
|
||||
}
|
||||
|
||||
#expanded-seek-bar {
|
||||
background-color: transparent;
|
||||
margin: 8px 0 4px 0;
|
||||
min-height: 10px;
|
||||
}
|
||||
|
||||
#expanded-seek-bar trough {
|
||||
min-width: 200px;
|
||||
|
||||
min-height: 2px;
|
||||
border-radius: 2px;
|
||||
background-color: alpha(#fff, 0.25);
|
||||
border: none;
|
||||
}
|
||||
|
||||
#expanded-seek-bar highlight {
|
||||
background: #ffffff;
|
||||
border-radius: 2px;
|
||||
border: none;
|
||||
}
|
||||
|
||||
#expanded-seek-bar slider {
|
||||
background: #ffffff;
|
||||
border: none;
|
||||
border-radius: 20%;
|
||||
min-width: 1px;
|
||||
min-height: 10px;
|
||||
margin: -3px;
|
||||
box-shadow: 0 1px 3px alpha(#000, 0.3);
|
||||
transition: all 0.1s ease;
|
||||
}
|
||||
|
||||
#expanded-seek-bar slider:hover {
|
||||
min-width: 4px;
|
||||
min-height: 14px;
|
||||
margin: -5px;
|
||||
box-shadow: 0 2px 6px alpha(#000, 0.4);
|
||||
}
|
||||
Reference in new issue
Block a user