feat: remote data storage for music
This commit is contained in:
parent
1a51be3702
commit
5aba16e5cf
5 changed files with 1061 additions and 2212 deletions
3
.env
3
.env
|
@ -1,3 +1,6 @@
|
||||||
|
ACCESS_KEY_WASABI=
|
||||||
|
SECRET_KEY_WASABI=
|
||||||
|
BUCKET_WASABI=
|
||||||
API_KEY_PLAUSIBLE=
|
API_KEY_PLAUSIBLE=
|
||||||
API_KEY_TRAKT=
|
API_KEY_TRAKT=
|
||||||
API_KEY_WEBMENTIONS_CORYD_DEV=
|
API_KEY_WEBMENTIONS_CORYD_DEV=
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
"@11ty/eleventy-fetch": "^4.0.0",
|
"@11ty/eleventy-fetch": "^4.0.0",
|
||||||
"@11ty/eleventy-img": "^3.1.0",
|
"@11ty/eleventy-img": "^3.1.0",
|
||||||
"@11ty/eleventy-plugin-syntaxhighlight": "^5.0.0",
|
"@11ty/eleventy-plugin-syntaxhighlight": "^5.0.0",
|
||||||
|
"@aws-sdk/client-s3": "^3.373.0",
|
||||||
"@catppuccin/tailwindcss": "^0.1.6",
|
"@catppuccin/tailwindcss": "^0.1.6",
|
||||||
"@commitlint/cli": "^17.6.6",
|
"@commitlint/cli": "^17.6.6",
|
||||||
"@commitlint/config-conventional": "^17.6.6",
|
"@commitlint/config-conventional": "^17.6.6",
|
||||||
|
|
2203
src/_data/json/cache/music.json
vendored
2203
src/_data/json/cache/music.json
vendored
File diff suppressed because it is too large
Load diff
|
@ -1,8 +1,17 @@
|
||||||
const fs = require('fs')
|
const { S3Client, GetObjectCommand, PutObjectCommand } = require('@aws-sdk/client-s3')
|
||||||
const _ = require('lodash')
|
const _ = require('lodash')
|
||||||
const { AssetCache } = require('@11ty/eleventy-fetch')
|
const { AssetCache } = require('@11ty/eleventy-fetch')
|
||||||
const artistAliases = require('./json/artist-aliases.json')
|
const artistAliases = require('./json/artist-aliases.json')
|
||||||
|
|
||||||
|
const getReadableData = (readable) => {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const chunks = []
|
||||||
|
readable.once('error', (err) => reject(err))
|
||||||
|
readable.on('data', (chunk) => chunks.push(chunk))
|
||||||
|
readable.once('end', () => resolve(chunks.join('')))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
const aliasArtist = (artist) => {
|
const aliasArtist = (artist) => {
|
||||||
const aliased = artistAliases.aliases.find((alias) => alias.aliases.includes(artist))
|
const aliased = artistAliases.aliases.find((alias) => alias.aliases.includes(artist))
|
||||||
if (aliased) artist = aliased.artist
|
if (aliased) artist = aliased.artist
|
||||||
|
@ -145,6 +154,17 @@ const titleCase = (string) => {
|
||||||
const sort = (array) => Object.values(array).sort((a, b) => b.plays - a.plays)
|
const sort = (array) => Object.values(array).sort((a, b) => b.plays - a.plays)
|
||||||
|
|
||||||
module.exports = async function () {
|
module.exports = async function () {
|
||||||
|
const client = new S3Client({
|
||||||
|
credentials: {
|
||||||
|
accessKeyId: process.env.ACCESS_KEY_WASABI,
|
||||||
|
secretAccessKey: process.env.SECRET_KEY_WASABI,
|
||||||
|
},
|
||||||
|
endpoint: {
|
||||||
|
url: 'https://s3.us-west-1.wasabisys.com',
|
||||||
|
},
|
||||||
|
region: 'us-west-1',
|
||||||
|
})
|
||||||
|
const WASABI_BUCKET = process.env.BUCKET_WASABI
|
||||||
const APPLE_BEARER = process.env.API_BEARER_APPLE_MUSIC
|
const APPLE_BEARER = process.env.API_BEARER_APPLE_MUSIC
|
||||||
const APPLE_MUSIC_TOKEN = process.env.API_TOKEN_APPLE_MUSIC
|
const APPLE_MUSIC_TOKEN = process.env.API_TOKEN_APPLE_MUSIC
|
||||||
const APPLE_TOKEN_RESPONSE = await fetch(process.env.APPLE_RENEW_TOKEN_URL, {
|
const APPLE_TOKEN_RESPONSE = await fetch(process.env.APPLE_RENEW_TOKEN_URL, {
|
||||||
|
@ -191,17 +211,28 @@ module.exports = async function () {
|
||||||
CURRENT_PAGE++
|
CURRENT_PAGE++
|
||||||
}
|
}
|
||||||
|
|
||||||
const cachedTracks = fs.readFileSync('./src/_data/json/cache/music.json', { encoding: 'utf8' })
|
const cachedTracksOutput = await client.send(
|
||||||
|
new GetObjectCommand({
|
||||||
|
Bucket: WASABI_BUCKET,
|
||||||
|
Key: 'music.json',
|
||||||
|
})
|
||||||
|
)
|
||||||
|
const cachedTracksData = getReadableData(cachedTracksOutput.Body)
|
||||||
|
const cachedTracks = await cachedTracksData.then((tracks) => JSON.parse(tracks)).catch()
|
||||||
const updatedCache = {
|
const updatedCache = {
|
||||||
...JSON.parse(cachedTracks),
|
...cachedTracks,
|
||||||
...diffTracks(JSON.parse(cachedTracks), formatTracks(res, time)),
|
...diffTracks(cachedTracks, formatTracks(res, time)),
|
||||||
}
|
}
|
||||||
charts = deriveCharts(updatedCache)
|
charts = deriveCharts(updatedCache)
|
||||||
charts.artists = sort(charts.artists).splice(0, 8)
|
charts.artists = sort(charts.artists).splice(0, 8)
|
||||||
charts.albums = sort(charts.albums).splice(0, 8)
|
charts.albums = sort(charts.albums).splice(0, 8)
|
||||||
fs.writeFileSync('./src/_data/json/cache/music.json', JSON.stringify(updatedCache), {
|
await client.send(
|
||||||
encoding: 'utf8',
|
new PutObjectCommand({
|
||||||
})
|
Bucket: WASABI_BUCKET,
|
||||||
|
Key: 'music.json',
|
||||||
|
Body: JSON.stringify(updatedCache),
|
||||||
|
})
|
||||||
|
)
|
||||||
await asset.save(charts, 'json')
|
await asset.save(charts, 'json')
|
||||||
return charts
|
return charts
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue