2024-05-18 18:03:24 -07:00

78 lines
2.2 KiB
TypeScript

import Player from "mpris-service";
import { settings } from "../../constants/settings";
import { settingsStore } from "../../scripts/settings";
import { Logger } from "../../features/logger";
import {
$tidalState,
coverArtPaths,
next,
pause,
play,
playPause,
previous,
stop,
toggleRepeat,
toggleShuffle,
} from "../state";
import { app } from "@electron/remote";
function toMicroseconds(seconds: number) {
return BigInt(seconds) * 1000_000n;
}
if (settingsStore.get(settings.mpris) && process.platform === "linux") {
try {
const player = Player({
name: "tidal-hifi",
identity: "tidal-hifi",
supportedUriSchemes: ["file"],
supportedMimeTypes: [
"audio/mpeg",
"audio/flac",
"audio/x-flac",
"application/ogg",
"audio/wav",
],
supportedInterfaces: ["player"],
desktopEntry: "tidal-hifi",
});
player.on("playPause", playPause);
player.on("next", next);
player.on("previous", previous);
player.on("pause", pause);
player.on("play", play);
player.on("stop", stop);
player.on("loopStatus", toggleRepeat);
player.on("shuffle", toggleShuffle);
player.on("quit", app.quit);
player.getPosition = function () {
return Number(toMicroseconds($tidalState.getState().currentTrack?.current ?? 0));
};
$tidalState.subscribe(async (state) => {
if (!player) return;
if (state.currentTrack) {
const coverUrl = await coverArtPaths.get(state.currentTrack.image);
player.metadata = {
"xesam:title": state.currentTrack.title,
"xesam:artist": state.currentTrack.artists,
"xesam:album": state.currentTrack.album,
"mpris:artUrl": coverUrl,
"mpris:length": toMicroseconds(state.currentTrack.duration),
"mpris:trackid": "/org/mpris/MediaPlayer2/track/" + state.currentTrack.id,
};
} else {
player.metadata = {
"mpris:trackid": "/org/mpris/MediaPlayer2/TrackList/NoTrack",
};
}
player.playbackStatus = state.status;
});
} catch (exception) {
console.error(exception);
Logger.log("MPRIS player api not working", exception);
}
}