Multiple accounts support, load tags online

This commit is contained in:
Cadence Ember 2025-04-02 17:03:03 +13:00
parent cd2827791f
commit 26ea869285
14 changed files with 295 additions and 124 deletions

View file

@ -1,30 +0,0 @@
// @ts-check
const domino = require("domino")
const sqlite = require("better-sqlite3")
const db = new sqlite("bc-explorer.db", {fileMustExist: true})
require("../db/migrate").migrate(db)
Object.assign(require("../passthrough"), {db})
const {from} = require("../db/orm")
const i = db.prepare("INSERT OR IGNORE INTO item_tag (item_id, tag) VALUES (?, ?)")
;(async () => {
const untaggedItems = from("item").select("item_id", "item_title", "item_url").join("item_tag", "item_id", "left").and("WHERE tag IS NULL").all()
console.log(`Downloading tags for ${untaggedItems.length} purchased items`)
let processed = 1
for (const {item_id, item_title, item_url} of untaggedItems) {
const html = await fetch(item_url).then(res => res.text())
const doc = domino.createDocument(html)
// @ts-ignore
const tags = [...doc.querySelectorAll(".tag").cache].map(e => e.textContent)
console.log(`[${processed}/${untaggedItems.length}] tagging ${item_title} with ${tags.join(", ")}`)
db.transaction(() => {
for (const tag of tags) {
i.run(item_id, tag)
}
})()
processed++
}
})()

View file

@ -11,7 +11,7 @@ const har = JSON.parse(fs.readFileSync("scripts/account.har", "utf8"))
assert(collection_summary)
const body = JSON.parse(collection_summary.response.content.text)
const {fan_id} = body
const {fan_id, username: account} = body.collection_summary
const count = Object.keys(body.collection_summary.tralbum_lookup).length
const newestPurchase = Object.values(body.collection_summary.tralbum_lookup).sort((a, b) => new Date(b.purchased).getTime() - new Date(a.purchased).getTime())[0]
@ -36,12 +36,15 @@ const har = JSON.parse(fs.readFileSync("scripts/account.har", "utf8"))
const db = new sqlite("bc-explorer.db")
require("../db/migrate").migrate(db)
const columns = ["item_id", "item_type", "band_id", "added", "updated", "purchased", "featured_track", "why", "also_collected_count", "item_title", "item_url", "item_art_url", "band_name", "band_url", "featured_track_title", "featured_track_number", "featured_track_duration", "album_id", "album_title", "price", "currency", "label", "label_id"]
db.prepare("INSERT OR IGNORE INTO account (account, fan_id) VALUES (?, ?)").run(account, fan_id)
const columns = ["account", "item_id", "item_type", "band_id", "added", "updated", "purchased", "featured_track", "why", "also_collected_count", "item_title", "item_url", "item_art_url", "band_name", "band_url", "featured_track_title", "featured_track_number", "featured_track_duration", "album_id", "album_title", "price", "currency", "label", "label_id"]
const upsert_columns = ["added", "updated", "purchased"]
const preparedItem = db.prepare(`INSERT OR IGNORE INTO item (${columns.join(", ")}) VALUES (${columns.map(x => "@" + x).join(", ")}) ON CONFLICT DO UPDATE SET ${upsert_columns.map(x => `${x} = @${x}`).join(", ")}`)
db.transaction(() => {
for (const item of items.items) {
preparedItem.run({
account,
...item,
purchased: new Date(item.purchased).getTime(),
added: new Date(item.added).getTime(),
@ -52,12 +55,13 @@ const har = JSON.parse(fs.readFileSync("scripts/account.har", "utf8"))
const storedItemCount = db.prepare("SELECT count(*) AS count FROM item").pluck().get()
console.log(`Stored ${storedItemCount} purchased items`)
const preparedTrack = db.prepare("INSERT OR IGNORE INTO track (item_id, track_id, title, artist, track_number, duration, mp3) VALUES (@item_id, @track_id, @title, @artist, @track_number, @duration, @mp3)")
const preparedTrack = db.prepare("INSERT OR IGNORE INTO track (account, item_id, track_id, title, artist, track_number, duration, mp3) VALUES (@account, @item_id, @track_id, @title, @artist, @track_number, @duration, @mp3)")
db.transaction(() => {
for (const [key, tracklist] of Object.entries(items.tracklists)) {
assert.match(key[0], /[at]/)
for (const track of tracklist) {
preparedTrack.run({
account,
item_id: key.slice(1),
track_id: track.id,
mp3: track.file?.["mp3-v0"],
@ -68,5 +72,4 @@ const har = JSON.parse(fs.readFileSync("scripts/account.har", "utf8"))
})()
const storedTrackCount = db.prepare("SELECT count(*) AS count FROM track").pluck().get()
console.log(`Stored ${storedTrackCount} tracks`)
console.log("To load tag data, please now run node ./scripts/load-tags.js")
})()