Enable seeking to specific points in the current song

This commit is contained in:
Danielle McLean 2023-12-06 13:54:40 +11:00
parent 04a976f6f3
commit 3372180a97
Signed by: 00dani
GPG key ID: 52C059C3B22A753E
5 changed files with 62 additions and 20 deletions

View file

@ -4,6 +4,7 @@ from pathlib import Path
from AppKit import NSCompositingOperationCopy, NSImage, NSMakeRect
from Foundation import CGSize, NSMutableDictionary
from MediaPlayer import (
MPChangePlaybackPositionCommandEvent,
MPMediaItemArtwork,
MPMediaItemPropertyAlbumTitle,
MPMediaItemPropertyAlbumTrackNumber,
@ -31,6 +32,7 @@ from MediaPlayer import (
MPRemoteCommandCenter,
MPRemoteCommandEvent,
MPRemoteCommandHandlerStatus,
MPRemoteCommandHandlerStatusSuccess,
)
from ..async_tools import run_background_task
@ -138,13 +140,17 @@ class CocoaNowPlaying:
cmd.removeTarget_(None)
cmd.addTargetWithHandler_(self._create_handler(handler))
seekCmd = self.cmd_center.changePlaybackPositionCommand()
seekCmd.setEnabled_(True)
seekCmd.removeTarget_(None)
seekCmd.addTargetWithHandler_(self._create_seek_handler(player.on_seek))
unsupported_cmds = (
self.cmd_center.changePlaybackRateCommand(),
self.cmd_center.seekBackwardCommand(),
self.cmd_center.skipBackwardCommand(),
self.cmd_center.seekForwardCommand(),
self.cmd_center.skipForwardCommand(),
self.cmd_center.changePlaybackPositionCommand(),
)
for cmd in unsupported_cmds:
cmd.setEnabled_(False)
@ -175,3 +181,14 @@ class CocoaNowPlaying:
return 0
return handler
def _create_seek_handler(
self, player: Callable[[float], Coroutine[None, None, None]]
) -> Callable[[MPChangePlaybackPositionCommandEvent], MPRemoteCommandHandlerStatus]:
def handler(
event: MPChangePlaybackPositionCommandEvent,
) -> MPRemoteCommandHandlerStatus:
run_background_task(player(event.positionTime()))
return MPRemoteCommandHandlerStatusSuccess
return handler

View file

@ -126,3 +126,6 @@ class MpdStateListener(Player):
async def on_prev(self) -> None:
await self.client.previous()
async def on_seek(self, position: float) -> None:
await self.client.seekcur(position)

View file

@ -21,3 +21,6 @@ class Player(Protocol):
async def on_prev(self) -> None:
...
async def on_seek(self, position: float) -> None:
...