forked from Shinonome/dots-hyprland
media controls: filter redundant players
This commit is contained in:
@@ -20,6 +20,7 @@ Scope {
|
|||||||
property bool visible: false
|
property bool visible: false
|
||||||
readonly property MprisPlayer activePlayer: MprisController.activePlayer
|
readonly property MprisPlayer activePlayer: MprisController.activePlayer
|
||||||
readonly property var realPlayers: Mpris.players.values.filter(player => isRealPlayer(player))
|
readonly property var realPlayers: Mpris.players.values.filter(player => isRealPlayer(player))
|
||||||
|
readonly property var meaningfulPlayers: filterDuplicatePlayers(realPlayers)
|
||||||
readonly property real osdWidth: Appearance.sizes.osdWidth
|
readonly property real osdWidth: Appearance.sizes.osdWidth
|
||||||
readonly property real widgetWidth: Appearance.sizes.mediaControlsWidth
|
readonly property real widgetWidth: Appearance.sizes.mediaControlsWidth
|
||||||
readonly property real widgetHeight: Appearance.sizes.mediaControlsHeight
|
readonly property real widgetHeight: Appearance.sizes.mediaControlsHeight
|
||||||
@@ -41,6 +42,33 @@ Scope {
|
|||||||
!(player.dbusName?.endsWith('.mpd') && !player.dbusName.endsWith('MediaPlayer2.mpd'))
|
!(player.dbusName?.endsWith('.mpd') && !player.dbusName.endsWith('MediaPlayer2.mpd'))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
function filterDuplicatePlayers(players) {
|
||||||
|
let filtered = [];
|
||||||
|
let used = new Set();
|
||||||
|
|
||||||
|
for (let i = 0; i < players.length; ++i) {
|
||||||
|
if (used.has(i)) continue;
|
||||||
|
let p1 = players[i];
|
||||||
|
let group = [i];
|
||||||
|
|
||||||
|
// Find duplicates by trackTitle prefix
|
||||||
|
for (let j = i + 1; j < players.length; ++j) {
|
||||||
|
let p2 = players[j];
|
||||||
|
if (p1.trackTitle && p2.trackTitle &&
|
||||||
|
(p1.trackTitle.startsWith(p2.trackTitle) || p2.trackTitle.startsWith(p1.trackTitle))) {
|
||||||
|
group.push(j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pick the one with non-empty trackArtUrl, or fallback to the first
|
||||||
|
let chosenIdx = group.find(idx => players[idx].trackArtUrl && players[idx].trackArtUrl.length > 0);
|
||||||
|
if (chosenIdx === undefined) chosenIdx = group[0];
|
||||||
|
|
||||||
|
filtered.push(players[chosenIdx]);
|
||||||
|
group.forEach(idx => used.add(idx));
|
||||||
|
}
|
||||||
|
return filtered;
|
||||||
|
}
|
||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
Hyprland.dispatch(`exec rm -rf ${baseCoverArtDir} && mkdir -p ${baseCoverArtDir}`)
|
Hyprland.dispatch(`exec rm -rf ${baseCoverArtDir} && mkdir -p ${baseCoverArtDir}`)
|
||||||
@@ -84,7 +112,7 @@ Scope {
|
|||||||
|
|
||||||
Repeater {
|
Repeater {
|
||||||
model: ScriptModel {
|
model: ScriptModel {
|
||||||
values: root.realPlayers
|
values: root.meaningfulPlayers
|
||||||
}
|
}
|
||||||
delegate: PlayerControl {
|
delegate: PlayerControl {
|
||||||
required property MprisPlayer modelData
|
required property MprisPlayer modelData
|
||||||
|
|||||||
Reference in New Issue
Block a user