Compare commits

...

4 commits
v1.5.2 ... main

6 changed files with 43 additions and 26 deletions

View file

@ -104,7 +104,7 @@
"Queue": {
"properties": {
"current": {
"description": "The zero-based index of the current song in MPD's queue.",
"description": "The zero-based index of the current song in MPD's queue. If MPD is currently stopped, then there is no current song in the queue, indicated by None.",
"title": "Current",
"type": "integer"
},

View file

@ -9,8 +9,8 @@ from .to_song import to_song
def to_queue(mpd: MpdState) -> Queue:
return Queue(
current=int(mpd.current["pos"]),
next=int(mpd.status["nextsong"]),
current=option_fmap(int, mpd.current.get("pos")),
next=int(mpd.status.get("nextsong", 0)),
length=int(mpd.status["playlistlength"]),
)

View file

@ -3,8 +3,10 @@ from dataclasses import dataclass
@dataclass(slots=True)
class Queue:
#: The zero-based index of the current song in MPD's queue.
current: int
#: The zero-based index of the current song in MPD's queue. If MPD is
#: currently stopped, then there is no current song in the queue, indicated
#: by None.
current: int | None
#: The index of the next song to be played, taking into account random and
#: repeat playback settings.
next: int

View file

@ -37,4 +37,4 @@ def ns_image_to_media_item_artwork(img: NSImage) -> MPMediaItemArtwork:
)
MPD_LOGO = logo_to_ns_image()
MPD_LOGO = ns_image_to_media_item_artwork(logo_to_ns_image())

View file

@ -1,7 +1,7 @@
from collections.abc import Callable, Coroutine
from typing import Literal
from corefoundationasyncio import CoreFoundationEventLoop
from AppKit import NSApplication, NSApplicationActivationPolicyAccessory
from MediaPlayer import (
MPChangePlaybackPositionCommandEvent,
MPMusicPlaybackStatePlaying,
@ -12,6 +12,8 @@ from MediaPlayer import (
MPRemoteCommandHandlerStatusSuccess,
)
from corefoundationasyncio import CoreFoundationEventLoop
from ...config.model import CocoaReceiverConfig
from ...playback import Playback
from ...playback.state import PlaybackState
@ -41,6 +43,9 @@ class CocoaNowPlayingReceiver(Receiver):
pass
async def start(self, player: Player) -> None:
NSApplication.sharedApplication().setActivationPolicy_(
NSApplicationActivationPolicyAccessory
)
self.cmd_center = MPRemoteCommandCenter.sharedCommandCenter()
self.info_center = MPNowPlayingInfoCenter.defaultCenter()

View file

@ -2,6 +2,16 @@ from typing import Final, Literal
from Foundation import CGSize
NSApplicationActivationPolicyRegular: Final = 0
NSApplicationActivationPolicyAccessory: Final = 1
NSApplicationActivationPolicyProhibited: Final = 2
NSApplicationActivationPolicy = Literal[0, 1, 2]
class NSApplication:
@staticmethod
def sharedApplication() -> NSApplication: ...
def setActivationPolicy_(self, policy: NSApplicationActivationPolicy) -> bool: ...
# There are many other operations available but we only actually use copy, so we don't need all of them here.
NSCompositingOperationClear: Final = 0
NSCompositingOperationCopy: Final = 1
@ -15,19 +25,19 @@ def NSMakeRect(x: float, y: float, w: float, h: float) -> NSRect: ...
class NSImage:
@staticmethod
def alloc() -> type[NSImage]: ...
@staticmethod
def initByReferencingFile_(file: str) -> NSImage: ...
@staticmethod
def initWithData_(data: bytes) -> NSImage: ...
@staticmethod
def initWithSize_(size: CGSize) -> NSImage: ...
def size(self) -> CGSize: ...
def lockFocus(self) -> None: ...
def unlockFocus(self) -> None: ...
def drawInRect_fromRect_operation_fraction_(self, inRect: NSRect, fromRect: NSRect, operation: NSCompositingOperation, fraction: float) -> None: ...
def drawInRect_fromRect_operation_fraction_(
self,
inRect: NSRect,
fromRect: NSRect,
operation: NSCompositingOperation,
fraction: float,
) -> None: ...