mirror of
https://github.com/r-freeman/portfolio.git
synced 2024-11-11 18:45:41 +00:00
101 lines
2.7 KiB
TypeScript
101 lines
2.7 KiB
TypeScript
import fetch from 'node-fetch'
|
|
|
|
const SPOTIFY_CLIENT_ID = process.env.SPOTIFY_CLIENT_ID
|
|
const SPOTIFY_CLIENT_SECRET = process.env.SPOTIFY_CLIENT_SECRET
|
|
const SPOTIFY_REFRESH_TOKEN = process.env.SPOTIFY_REFRESH_TOKEN
|
|
const SPOTIFY_TOKEN = "https://accounts.spotify.com/api/token"
|
|
const SPOTIFY_CURRENTLY_PLAYING = "https://api.spotify.com/v1/me/player/currently-playing"
|
|
const SPOTIFY_RECENTLY_PLAYED = "https://api.spotify.com/v1/me/player/recently-played"
|
|
const SPOTIFY_TOP_ARTISTS = "https://api.spotify.com/v1/me/top/artists"
|
|
|
|
const basic = Buffer.from(`${SPOTIFY_CLIENT_ID}:${SPOTIFY_CLIENT_SECRET}`).toString('base64')
|
|
|
|
type Response = {
|
|
access_token: string
|
|
token_type: string
|
|
scope: string
|
|
expires_in: number
|
|
refresh_token: string
|
|
}
|
|
|
|
const getAccessToken = async () => {
|
|
const response = await fetch(SPOTIFY_TOKEN, {
|
|
method: 'POST',
|
|
headers: {
|
|
Authorization: `Basic ${basic}`,
|
|
'Content-Type': 'application/x-www-form-urlencoded',
|
|
},
|
|
body: new URLSearchParams({
|
|
'grant_type': 'refresh_token',
|
|
'refresh_token': `${SPOTIFY_REFRESH_TOKEN}`
|
|
})
|
|
})
|
|
|
|
return response.json()
|
|
}
|
|
|
|
export const getCurrentlyPlaying = async () => {
|
|
const {access_token}: Response = await getAccessToken() as Response
|
|
|
|
return await fetch(SPOTIFY_CURRENTLY_PLAYING, {
|
|
headers: {
|
|
Authorization: `Bearer ${access_token}`
|
|
}
|
|
})
|
|
}
|
|
|
|
|
|
export const getRecentlyPlayed = async () => {
|
|
const {access_token}: Response = await getAccessToken() as Response
|
|
|
|
return await fetch(SPOTIFY_RECENTLY_PLAYED, {
|
|
headers: {
|
|
Authorization: `Bearer ${access_token}`
|
|
}
|
|
})
|
|
}
|
|
|
|
type TopArtistItem = {
|
|
name: string
|
|
uri: string
|
|
genres: string[]
|
|
}
|
|
|
|
type TopArtistsResponse = {
|
|
items: TopArtistItem[]
|
|
}
|
|
|
|
export const getTopArtist = async () => {
|
|
const {access_token}: Response = await getAccessToken() as Response
|
|
|
|
const response = await fetch(SPOTIFY_TOP_ARTISTS, {
|
|
headers: {
|
|
Authorization: `Bearer ${access_token}`
|
|
}
|
|
}).then(r => r.json()) as TopArtistsResponse
|
|
|
|
const artist = response.items[0].name
|
|
const uri = response.items[0].uri
|
|
|
|
return {
|
|
artist,
|
|
uri
|
|
}
|
|
}
|
|
|
|
export const getTopGenre = async () => {
|
|
const {access_token}: Response = await getAccessToken() as Response
|
|
|
|
const response = await fetch(SPOTIFY_TOP_ARTISTS, {
|
|
headers: {
|
|
Authorization: `Bearer ${access_token}`
|
|
}
|
|
}).then(r => r.json()) as TopArtistsResponse
|
|
|
|
let genre = response.items[0].genres[0]
|
|
genre = genre.charAt(0).toUpperCase() + genre.slice(1)
|
|
|
|
return {
|
|
genre
|
|
}
|
|
} |