creates video voice memos from audio clips; with bluesky integration.
trill.ptr.pet
1import { XrpcHandleResolver } from "@atcute/identity-resolver";
2import { OAuthUserAgent } from "@atcute/oauth-browser-client";
3import { Client as AtcuteClient, simpleFetchHandler } from "@atcute/client";
4import { getSessionClient } from "./oauth";
5import { AppBskyFeedPost } from "@atcute/bluesky";
6import { AtprotoDid } from "@atcute/lexicons/syntax";
7
8export const slingshotUrl = "https://slingshot.microcosm.blue";
9
10export const handleResolver = new XrpcHandleResolver({
11 serviceUrl: slingshotUrl,
12});
13export const slingshot = new AtcuteClient({
14 handler: simpleFetchHandler({ service: slingshotUrl }),
15});
16
17export const login = async (agent: OAuthUserAgent) => {
18 const rpc = new AtcuteClient({ handler: agent });
19 const res = await rpc.get("com.atproto.server.getSession", { params: {} });
20 if (!res.ok) throw res.data.error;
21 const didDoc = await slingshot.get(
22 "com.bad-example.identity.resolveMiniDoc",
23 { params: { identifier: res.data.did } },
24 );
25 if (!didDoc.ok) throw didDoc.data.error;
26 return {
27 client: rpc,
28 did: res.data.did,
29 handle: res.data.handle,
30 pds: didDoc.data.pds,
31 };
32};
33
34export const sendPost = async (
35 did: AtprotoDid,
36 blob: Blob,
37 postContent: string,
38 altText?: string,
39) => {
40 const login = await getSessionClient(did);
41 const upload = await login.client.post("com.atproto.repo.uploadBlob", {
42 input: blob,
43 });
44 if (!upload.ok) throw `failed to upload blob: ${upload.data.error}`;
45 const record: AppBskyFeedPost.Main = {
46 $type: "app.bsky.feed.post",
47 text: postContent,
48 embed: {
49 $type: "app.bsky.embed.video",
50 video: upload.data.blob,
51 alt: altText,
52 },
53 createdAt: new Date().toISOString(),
54 };
55 const result = await login.client.post("com.atproto.repo.createRecord", {
56 input: {
57 collection: "app.bsky.feed.post",
58 record,
59 repo: did,
60 },
61 });
62 if (!result.ok) throw `failed to upload post: ${result.data.error}`;
63 return result.data;
64};