Media controls (MPRIS, Windows SMTC); stop old tracks when switching

This commit is contained in:
sarah committed 2026-10-09 18:57:03 +02:00
1 parent e2d7515e08
commit d7f5eba1c2
14 files changed
+799 -26

No files matched your search

+21 -5
View File
@@ -15,7 +15,7 @@ from Library import Library, Matches
from Metadata import Track
from Player import Player
from Playlists import ExportM3U, LoadPlaylists, NameTaken, Playlist, ReadM3U
from PlayQueue import RestartAfterMs, Session, LoadSession
from PlayQueue import RepeatModes, RestartAfterMs, Session, LoadSession
from Transport import CoverImage, Transport
from Widgets import App, EmptyState
@@ -51,6 +51,7 @@ class MusicMode(ft.Column):
self.ViewArgument: object = None
self.Shown: list[Track] = []
self.RowsByPath: dict[str, list[ft.Container]] = {}
self.NowPlaying: Optional[Track] = None # for the system media controls
ThePlayer.OnEnded = lambda: TheApp.Page.run_task(self._Ended)
ThePlayer.OnChanged = self._PlayerChanged
@@ -507,12 +508,14 @@ class MusicMode(ft.Column):
IsCurrent = PathText == Current and (Context != "Queue" or Index == self.Queue.Index)
Row.bgcolor = Palette.Surface0 if IsCurrent else None
Lead = Row.content.controls[0]
if isinstance(Lead, ft.Container) and isinstance(Lead.data, ft.Text):
Lead = Lead.data # already showing the icon: start from the number again
if IsCurrent:
Row.content.controls[0] = ft.Container(
ft.Icon(ft.Icons.VOLUME_UP if self.ThePlayer.Playing else ft.Icons.PAUSE, size=16,
color=Palette.Mauve), width=36, data=Lead)
elif isinstance(Lead, ft.Container) and isinstance(Lead.data, ft.Text):
Row.content.controls[0] = Lead.data
else:
Row.content.controls[0] = Lead
async def _RowClicked(self, Context: str, Index: int) -> None:
if Context == "Queue":
@@ -552,6 +555,8 @@ class MusicMode(ft.Column):
self.TheApp.Notify("Couldn't play any song in the queue (missing or unplayable files).", "error")
def _ShowNowPlaying(self, Item: Track) -> None:
self.NowPlaying = Item
self.TheApp.MediaChanged()
Subtitle = " - ".join(Part for Part in (Item.DisplayArtist, Item.Album) if Part)
self.Bar.ShowTrack(Item.DisplayTitle, Subtitle, None)
self.TheApp.Page.run_task(self._LoadBarCover, Item.Path)
@@ -606,7 +611,11 @@ class MusicMode(ft.Column):
self.RepeatButton.tooltip = f"Repeat: {self.Queue.Repeat.lower()}"
def _ToggleShuffle(self, e) -> None:
self.Queue.SetShuffle(not self.Queue.Shuffle)
self.SetShuffle(not self.Queue.Shuffle)
def SetShuffle(self, Enabled: bool) -> None:
self.Queue.SetShuffle(Enabled)
self.TheApp.MediaModesChanged()
self._ShowModes()
self._Show(self.ShuffleButton)
self.SaveSession()
@@ -614,7 +623,12 @@ class MusicMode(ft.Column):
self._Rebuild()
def _CycleRepeat(self, e) -> None:
self.Queue.CycleRepeat()
self.SetRepeat(RepeatModes[(RepeatModes.index(self.Queue.Repeat) + 1) % len(RepeatModes)])
def SetRepeat(self, Mode: str) -> None:
"""Off, All or One."""
self.Queue.Repeat = Mode if Mode in RepeatModes else "Off"
self.TheApp.MediaModesChanged()
self._ShowModes()
self._Show(self.RepeatButton)
self.SaveSession()
@@ -659,6 +673,8 @@ class MusicMode(ft.Column):
self.Queue.Clear()
self.TheApp.Page.run_task(self.ThePlayer.Stop)
self.Bar.ShowTrack("Nothing playing", "", None)
self.NowPlaying = None
self.TheApp.MediaChanged()
self._AfterQueueEdit()
def _Reordered(self, Context: str, Old: Optional[int], New: Optional[int]) -> None: