typed lastfm things
This commit is contained in:
parent
99ba9cef4b
commit
6c9d093c8c
3 changed files with 67 additions and 14 deletions
|
@ -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
42
src/types/lastfm.ts
Normal 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"]
|
||||||
|
};
|
||||||
|
}
|
|
@ -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";
|
Loading…
Add table
Add a link
Reference in a new issue