typed lastfm things

This commit is contained in:
darwinx64 2025-04-21 06:42:14 -05:00
parent 99ba9cef4b
commit 6c9d093c8c
No known key found for this signature in database
3 changed files with 67 additions and 14 deletions

View file

@ -2,6 +2,7 @@
import LastFMIcon from "@assets/svg/fm.svg" import LastFMIcon from "@assets/svg/fm.svg"
--- ---
<div class="spotify-card-wrapper-shadow"> <div class="spotify-card-wrapper-shadow">
<h4>I'm listening to</h4>
<div class="spotify-card-wrapper"> <div class="spotify-card-wrapper">
<div class="spotify-card"> <div class="spotify-card">
<svg aria-hidden="true" class="blur"> <svg aria-hidden="true" class="blur">
@ -29,6 +30,11 @@ import LastFMIcon from "@assets/svg/fm.svg"
</div> </div>
</div> </div>
<style> <style>
h4 {
color: var(--subtext0);
margin-bottom: 10px;
}
.blur { .blur {
display: none; display: none;
} }
@ -132,24 +138,29 @@ import LastFMIcon from "@assets/svg/fm.svg"
<script> <script>
import { mergeStyles } from "utils/mergeStyles"; import { mergeStyles } from "utils/mergeStyles";
import { average } from "color.js"; import { average } from "color.js";
import { LASTFM_KEY, LASTFM_API } from "utils/constants"; import { LASTFM_KEY, LASTFM_API, LASTFM_USER } from "utils/constants";
import {
type FMResponse,
type FMRawTrack,
type FMTrack,
transformRawTrack
} from "types/lastfm";
const spotifyCardWrapper: HTMLElement = document.querySelector(".spotify-card-wrapper-shadow"); const spotifyCardWrapper: HTMLElement = document.querySelector(".spotify-card-wrapper-shadow");
async function getLastFmTracks() { async function getLastFmTracks() {
const params = new URLSearchParams({ const params = new URLSearchParams({
method: "user.getrecenttracks", method: "user.getrecenttracks",
api_key: LASTFM_KEY, api_key: LASTFM_KEY,
user: "nin0dev", user: LASTFM_USER,
limit: "50", limit: "50",
format: "json", format: "json",
extended: "true" extended: "true"
}); });
const response = await( const response: FMResponse = await(
await fetch(`${LASTFM_API}${params}`) await fetch(`${LASTFM_API}${params}`)
).json(); ).json();
// TODO: make lastfm stuff typed
if ( if (
response.recenttracks.track.some(t => { response.recenttracks.track.some(t => {
try { try {
@ -159,20 +170,19 @@ import LastFMIcon from "@assets/svg/fm.svg"
} }
}) })
) { ) {
const track = response.recenttracks.track[0]; const rawTrack: FMRawTrack = response.recenttracks.track[0];
const track: FMTrack = transformRawTrack(rawTrack);
mergeStyles({ mergeStyles({
"display": "block", "display": "block",
"--album-art": `url("${track.image[1]["#text"]}")`,
"--track": `'${track.name}'`, "--track": `'${track.name}'`,
"--album": `'${track.album["#text"]}'`, "--artist": `'${track.artist}'`,
"--album": `'${track.album}'`,
"--album-art": `url("${track.albumArt}")`,
"--album-color": await average( "--album-color": await average(
`${track.image[1]["#text"]}`, track.albumArt,
{ { format: "hex" }
format: "hex" )
}
),
"--artist": `'${track.artist.name}'`
}, spotifyCardWrapper.style); }, spotifyCardWrapper.style);
(document.querySelector(".lastfm-link") as HTMLLinkElement).href = track.url; (document.querySelector(".lastfm-link") as HTMLLinkElement).href = track.url;

42
src/types/lastfm.ts Normal file
View file

@ -0,0 +1,42 @@
export interface FMRawTrack {
name: string;
url: string;
album: {
"#text": string;
};
artist: {
name: string;
};
image: Array<{
size: string;
"#text": string;
}>;
"@attr"?: {
nowplaying?: string;
};
}
export interface FMTrack {
name: string;
artist: string;
album: string;
url: string;
albumArt: string;
}
export interface FMResponse {
recenttracks: {
track: FMRawTrack[];
};
};
export function transformRawTrack(raw: FMRawTrack): FMTrack {
return {
name: raw.name,
artist: raw.artist.name,
album: raw.album["#text"],
url: raw.url,
albumArt: raw.image[1]["#text"]
};
}

View file

@ -1,4 +1,5 @@
export const LASTFM_KEY: string = "3c5623fa1abbd11c49f53ca18e992ead"; export const LASTFM_KEY: string = "3c5623fa1abbd11c49f53ca18e992ead";
export const LASTFM_API: string = "https://ws.audioscrobbler.com/2.0/?"; export const LASTFM_API: string = "https://ws.audioscrobbler.com/2.0/?";
export const LASTFM_USER: string = "nin0dev";
export const LANYARD_ID: string = "886685857560539176"; export const LANYARD_ID: string = "886685857560539176";
export const LANYARD_API: string = "wss://api.lanyard.rest/socket"; export const LANYARD_API: string = "wss://api.lanyard.rest/socket";