Fix: Fix multiple artists not being possible to display (hopefully)

I think it should fix the iOS crash issue, but I may be wrong, also,
bump to 1.3.1
This commit is contained in:
kmmiio99o 2025-12-09 20:27:19 +01:00
parent 908c5bc2b0
commit 0a59dc8cc5
2 changed files with 45 additions and 3 deletions

View file

@ -308,7 +308,7 @@ export default function Settings() {
subLabel="Show off your music status from multiple services"
/>
<TableRow label="Author" subLabel="kmmiio99o" />
<TableRow label="Version" subLabel="1.3.0" />
<TableRow label="Version" subLabel="1.3.1" />
</TableRowGroup>
</Stack>
</ScrollView>

View file

@ -14,6 +14,7 @@ export default function RPCPreview() {
const fallbackTrack = {
name: "Bohemian Rhapsody",
artist: "Queen",
artists: ["Queen"],
album: "A Night at the Opera",
image: null,
nowPlaying: true,
@ -21,6 +22,44 @@ export default function RPCPreview() {
startTime: Math.floor(Date.now() / 1000) - 120,
};
// Helper function to parse artist data from Last.fm
const parseArtists = (artistData: any): string[] => {
if (!artistData) return ["Unknown Artist"];
// Case 1: Already an array of strings
if (Array.isArray(artistData)) {
return artistData.filter((a) => a && typeof a === "string");
}
// Case 2: Object with "#text" field (Last.fm standard)
if (artistData["#text"]) {
const artistText = artistData["#text"];
// Split by comma, semicolon, or "&" and clean up
return artistText
.split(/[,;&]/)
.map((artist: string) => artist.trim())
.filter((artist: string) => artist.length > 0);
}
// Case 3: Plain string
if (typeof artistData === "string") {
return artistData
.split(/[,;&]/)
.map((artist: string) => artist.trim())
.filter((artist: string) => artist.length > 0);
}
return ["Unknown Artist"];
};
// Helper function to format artists for display
const formatArtists = (artists: string[]): string => {
if (!artists || artists.length === 0) return "Unknown Artist";
if (artists.length === 1) return artists[0];
if (artists.length === 2) return `${artists[0]} & ${artists[1]}`;
return `${artists.slice(0, -1).join(", ")} & ${artists[artists.length - 1]}`;
};
React.useEffect(() => {
const fetchPreviewData = async () => {
if (!getStorage("username") || !getStorage("apiKey")) {
@ -44,11 +83,13 @@ export default function RPCPreview() {
data.recenttracks.track.length > 0
) {
const track = data.recenttracks.track[0];
const artists = parseArtists(track.artist);
let duration = 180;
try {
const primaryArtist = artists[0] || "Unknown Artist";
const trackInfoResponse = await fetch(
`https://ws.audioscrobbler.com/2.0/?method=track.getInfo&api_key=${getStorage("apiKey")}&artist=${encodeURIComponent(track.artist["#text"])}&track=${encodeURIComponent(track.name)}&format=json&username=${getStorage("username")}`,
`https://ws.audioscrobbler.com/2.0/?method=track.getInfo&api_key=${getStorage("apiKey")}&artist=${encodeURIComponent(primaryArtist)}&track=${encodeURIComponent(track.name)}&format=json&username=${getStorage("username")}`,
);
const trackInfo = await trackInfoResponse.json();
if (trackInfo.track && trackInfo.track.duration) {
@ -60,7 +101,8 @@ export default function RPCPreview() {
setPreviewTrack({
name: track.name || "Unknown Track",
artist: track.artist?.["#text"] || "Unknown Artist",
artist: formatArtists(artists),
artists: artists,
album: track.album?.["#text"] || "Unknown Album",
image:
track.image?.[2]?.["#text"] ||