tealfix.ts
edited
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});