mirror of
https://github.com/arthur-pbty/arthur-os.git
synced 2026-08-03 20:28:21 +02:00
127 lines
3.9 KiB
JavaScript
127 lines
3.9 KiB
JavaScript
function isProxyPlayer(player) {
|
|
var dbusName = String(player && player.dbusName || "").toLowerCase()
|
|
var desktopEntry = String(player && player.desktopEntry || "").toLowerCase()
|
|
return dbusName.indexOf("playerctld") !== -1 || desktopEntry === "playerctld"
|
|
}
|
|
|
|
function hasMetadata(player) {
|
|
return !!(player && (player.trackTitle || player.trackArtist || player.identity || player.desktopEntry))
|
|
}
|
|
|
|
function hasTrackMetadata(player) {
|
|
return !!(player && (player.trackTitle || player.trackArtist || player.trackAlbum || player.trackArtUrl))
|
|
}
|
|
|
|
function playerCanControl(player) {
|
|
return !!(player && (player.canTogglePlaying || player.canPlay || player.canPause || player.canGoNext || player.canGoPrevious))
|
|
}
|
|
|
|
function canHandleAction(player, action) {
|
|
if (!player) return false
|
|
if (action === "next") return !!player.canGoNext
|
|
if (action === "previous") return !!player.canGoPrevious
|
|
if (action === "play") return !!(player.canPlay || player.canTogglePlaying)
|
|
if (action === "pause") return !!(player.canPause || player.canTogglePlaying)
|
|
if (action === "playPause") return !!(player.canTogglePlaying || player.canPlay || player.canPause)
|
|
return false
|
|
}
|
|
|
|
function canCycleSource(player) {
|
|
return !!(player && hasMetadata(player) && (player.isPlaying || player.canPlay))
|
|
}
|
|
|
|
function nodeProps(node) {
|
|
return node && node.ready && node.properties ? node.properties : {}
|
|
}
|
|
|
|
function isPlaybackStream(node) {
|
|
if (!node || !node.isStream) return false
|
|
if (node.isSink === true) return true
|
|
|
|
var mediaClass = String(node.type || "")
|
|
return mediaClass.indexOf("Stream/Output/Audio") !== -1
|
|
|| mediaClass.indexOf("AudioOutStream") !== -1
|
|
|| mediaClass.indexOf("Output") !== -1
|
|
}
|
|
|
|
function streamLabelKey(label) {
|
|
var key = String(label || "").toLowerCase()
|
|
key = key.replace(/^pipewire alsa \[/, "")
|
|
key = key.replace(/\]$/, "")
|
|
key = key.replace(/^alsa playback \[/, "")
|
|
key = key.replace(/[^a-z0-9]+/g, "")
|
|
return key
|
|
}
|
|
|
|
function rawStreamLabel(node) {
|
|
if (!node) return ""
|
|
var p = nodeProps(node)
|
|
return p["application.name"]
|
|
|| node.description
|
|
|| p["media.name"]
|
|
|| p["node.name"]
|
|
|| node.name
|
|
}
|
|
|
|
function playerAppLabel(player) {
|
|
if (!player) return ""
|
|
var dbus = String(player.dbusName || "")
|
|
dbus = dbus.replace(/^org\.mpris\.MediaPlayer2\./, "")
|
|
dbus = dbus.replace(/\.instance[0-9]+$/, "")
|
|
return player.desktopEntry || player.identity || dbus
|
|
}
|
|
|
|
function playerHasPlaybackStream(player, playbackStreams) {
|
|
var playerKey = streamLabelKey(playerAppLabel(player))
|
|
if (!playerKey) return false
|
|
|
|
var streams = Array.isArray(playbackStreams) ? playbackStreams : []
|
|
for (var i = 0; i < streams.length; i++) {
|
|
var streamKey = streamLabelKey(rawStreamLabel(streams[i]))
|
|
if (!streamKey) continue
|
|
if (streamKey === playerKey
|
|
|| streamKey.indexOf(playerKey) !== -1
|
|
|| playerKey.indexOf(streamKey) !== -1)
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
function playerKey(player) {
|
|
if (!player) return ""
|
|
return String(player.dbusName || player.desktopEntry || player.identity || "")
|
|
}
|
|
|
|
function labelFor(player) {
|
|
if (!player) return ""
|
|
return player.trackTitle || player.identity || player.desktopEntry || ""
|
|
}
|
|
|
|
function osdMessage(player, fallback) {
|
|
if (!player) return fallback
|
|
var label = labelFor(player)
|
|
if (label && player.trackArtist) return label + " - " + player.trackArtist
|
|
return label || fallback
|
|
}
|
|
|
|
if (typeof module !== "undefined") {
|
|
module.exports = {
|
|
isProxyPlayer: isProxyPlayer,
|
|
hasMetadata: hasMetadata,
|
|
hasTrackMetadata: hasTrackMetadata,
|
|
playerCanControl: playerCanControl,
|
|
canHandleAction: canHandleAction,
|
|
canCycleSource: canCycleSource,
|
|
nodeProps: nodeProps,
|
|
isPlaybackStream: isPlaybackStream,
|
|
streamLabelKey: streamLabelKey,
|
|
rawStreamLabel: rawStreamLabel,
|
|
playerAppLabel: playerAppLabel,
|
|
playerHasPlaybackStream: playerHasPlaybackStream,
|
|
playerKey: playerKey,
|
|
labelFor: labelFor,
|
|
osdMessage: osdMessage
|
|
}
|
|
}
|