single use script i wrote to fix some incorrect metadata in my tealfm stamps/scrobbles
tealfix.ts edited
74 lines 2.7 kB view raw
1import type { ComAtprotoRepoListRecords } from "@atcute/atproto"; 2import { AtpSessionData, Client, CredentialManager, ok } from "@atcute/client"; 3 4const TEAL_COLLECTION = "fm.teal.alpha.feed.play"; 5 6const { AT_USER: username, AT_PASS: password, AT_PDS: pds } = process.env; 7if (!username || !password || !pds) process.exit(1); 8 9console.log("locking tf in"); 10const manager = new CredentialManager({ service: pds }); 11const rpc = new Client({ handler: manager }); 12await manager.login({ identifier: username, password }); 13const session: AtpSessionData = await ok(rpc.get("com.atproto.server.getSession")) as AtpSessionData; 14console.log(`locked tf in as ${session.handle} (${session.did})`); 15 16let needles = { 17 "83e66b1b-4e54-4a82-88c5-14b61e94443c": "2c1069e4-f30a-490a-b00b-cf1d9804b6fe", // recording (from music video) 18 "eefb0252-9f9e-44f5-aab9-f8c74cdbd022": "a3efa0ae-3be3-4de8-8019-fea7d87ddc1f", // release (from music video) 19 "If I Were To Die": "If I Were to Die", 20}; 21 22let records: ComAtprotoRepoListRecords.Record[] = []; 23let purrsor = null; 24 25while (true) { 26 let response = await ok(rpc.get("com.atproto.repo.listRecords", { 27 params: { 28 repo: session.did, 29 collection: TEAL_COLLECTION, 30 cursor: purrsor, 31 }, 32 })) as any; // typescript coffee emoji 33 34 purrsor = response.cursor; 35 response.records.forEach((record: ComAtprotoRepoListRecords.Record) => { 36 records.push(record); 37 }); 38 39 if (!purrsor) break; 40} 41 42console.log(`fetched ${records.length} records`); 43 44records.forEach(async (record) => { 45 let v = record.value; 46 let rkey = record.uri.split("/").at(-1) || ""; 47 if (rkey == "") { // this can't happen but whatever 48 console.log("WHAT THE FUCK!!!!!!!!!!"); 49 process.exit(2); 50 } 51 52 let modified = false; 53 for (const k in needles) { 54 const replacement = needles[k as keyof typeof needles]; 55 if (v.trackName == k || v.releaseName == k || v.releaseMbId == k || v.recordingMbId == k) modified = true; 56 if (v.trackName == k) record.value.trackName = replacement; 57 if (v.releaseName == k) record.value.releaseName = replacement; 58 if (v.releaseMbId == k) record.value.releaseMbId = replacement; 59 if (v.recordingMbId == k) record.value.recordingMbId = replacement; 60 } 61 62 if (modified) { 63 let response = await ok(rpc.post("com.atproto.repo.putRecord", { 64 input: { 65 collection: TEAL_COLLECTION, 66 repo: session.did, 67 rkey: rkey, 68 record: record.value 69 } 70 })); 71 72 console.log(`${rkey}: [replace] fixed record:`, response); 73 } 74});