summaryrefslogtreecommitdiffstats
path: root/src/index.ts
blob: b083604ce0bd560d7d6a5d9a96bd8f1569673ac0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import * as e621 from "./api/e621";
import * as mastodon from "./api/mastodon";
import config from "./config";
import Sharp from "sharp";
import * as cliArgs from "ts-command-line-args";

const args = cliArgs.parse<{
    id?: number;
    help?: boolean;
}>(
    {
        id: { type: Number, optional: true },
        help: { type: Boolean, optional: true, alias: "h" },
    },
    {
        helpArg: "help",
    }
);

async function postRandomPicture() {
    console.log("Fetching random post...");

    const queryIndex = Math.floor(Math.random() * config.e621.queries.length);
    const query = config.e621.queries[queryIndex];
    const post = await e621.getRandomPost(query);

    console.log(`Got ${post.id} via query ${queryIndex}`);

    await handlePost(post);
}

async function postSpecificPicture(id: number) {
    console.log(`Fetching post ${id}...`);

    const post = await e621.getPostById(id);

    console.log(`Got ${post.id}`);

    await handlePost(post);
}

async function handlePost(post: e621.Post) {
    const source = post.sources.length ? post.sources[0] : undefined;
    const cws = config.cw.filter((w) => post.tags.general.includes(w));

    console.log(`Downloading image...`);

    let file = await e621.client.get(post.file.url).buffer();

    if (Buffer.byteLength(file) > 1024 * 1024 * 9) {
        console.log(`Compressing...`);

        file = await Sharp(file)
            .resize(1800, 1800, { fit: "inside", withoutEnlargement: true })
            .jpeg({ quality: 80, mozjpeg: true })
            .toBuffer();
    }

    console.log(`Uploading...`);

    const attachment = await mastodon.upload(file, post.id.toString(10));

    console.log(`Posting status...`);

    const status = await mastodon.createStatus(`https://e926.net/posts/${post.id}`, source, cws, attachment.id);

    console.log(`Done! ${status.url}`);
}

(async () => {
    if (!config.mastodon.token) {
        console.error("MASTODON_TOKEN not set");
        return;
    }

    if (args.id) {
        await postSpecificPicture(args.id);
    } else {
        await postRandomPicture();
    }
})();