Run posts
This commit is contained in:
parent
4ff8a61c21
commit
c736d6ae7a
|
@ -13,4 +13,6 @@ ARTIST="Unknown"
|
|||
GEOCODE_API_KEY=""
|
||||
TITLE=""
|
||||
H1=""
|
||||
DEST="remote:/dir/"
|
||||
DEST="remote:/dir/"
|
||||
BSKY_USER=""
|
||||
BSKY_PASSWORD=""
|
|
@ -99,6 +99,29 @@ class DB {
|
|||
}
|
||||
return rows;
|
||||
}
|
||||
async getBsky() {
|
||||
const query = `SELECT * FROM photos WHERE bsky = 0 ORDER BY score ASC, created DESC LIMIT 1;`;
|
||||
let rows = [];
|
||||
try {
|
||||
rows = await this.all(query);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error getting all photos`, err);
|
||||
}
|
||||
if (rows.length === 0) {
|
||||
return null;
|
||||
}
|
||||
return rows[0];
|
||||
}
|
||||
async confirmBsky(id) {
|
||||
const query = `UPDATE photos SET bsky = 1 WHERE id = ?;`;
|
||||
try {
|
||||
await this.run(query, [id]);
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
async cacheLocation(location, latlng) {
|
||||
const query = `INSERT OR IGNORE INTO geocode (location, latitude, longitude) VALUES (?, ?, ?);`;
|
||||
try {
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"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"}
|
|
@ -0,0 +1,106 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
require("dotenv/config");
|
||||
const log_1 = require("./log");
|
||||
const promises_1 = require("fs/promises");
|
||||
const path_1 = require("path");
|
||||
const api_1 = require("@atproto/api");
|
||||
const db_1 = require("./db");
|
||||
const env_1 = require("./env");
|
||||
class Post {
|
||||
constructor() {
|
||||
this.log = (0, log_1.createLog)('post');
|
||||
this.db = new db_1.DB();
|
||||
this.bskyAgent = new api_1.BskyAgent({ service: 'https://bsky.social' });
|
||||
this.post();
|
||||
}
|
||||
async post() {
|
||||
await this.bsky();
|
||||
}
|
||||
bskyDescription(photo) {
|
||||
return `${photo.description}
|
||||
|
||||
${photo.format}${photo.filmstock !== 'Unknown' ? ' - ' + photo.filmstock : ''}`;
|
||||
}
|
||||
async bsky() {
|
||||
const photo = await this.db.getBsky();
|
||||
const identifier = (0, env_1.envString)('BSKY_USER', null);
|
||||
const password = (0, env_1.envString)('BSKY_PASSWORD', null);
|
||||
let text;
|
||||
let post;
|
||||
let imagePath;
|
||||
let imageData;
|
||||
let blobResponse;
|
||||
let postData;
|
||||
if (identifier === null || password === null) {
|
||||
this.log.error(`Cannot post without Bluesky username or password`);
|
||||
return;
|
||||
}
|
||||
if (photo === null) {
|
||||
this.log.warn(`Nothing to post`);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
await this.bskyAgent.login({ identifier, password });
|
||||
this.log.info(`Logged into Bluesky`);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error logging into Bluesky`, err);
|
||||
return;
|
||||
}
|
||||
text = this.bskyDescription(photo);
|
||||
/*
|
||||
embed: {
|
||||
images: [
|
||||
{
|
||||
image: testUpload.data.blob,
|
||||
alt: "",
|
||||
},
|
||||
],
|
||||
$type: "app.bsky.embed.images",
|
||||
},
|
||||
*/
|
||||
imagePath = (0, path_1.join)((0, env_1.envString)('WWW', './www'), 'img', `${photo.id}_full.jpg`);
|
||||
try {
|
||||
imageData = await (0, promises_1.readFile)(imagePath);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error reading image data ${imagePath}`, err);
|
||||
}
|
||||
try {
|
||||
blobResponse = await this.bskyAgent.uploadBlob(imageData, { contentType: 'image/jpeg' });
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error uploading blob to Bluesky`, err);
|
||||
return;
|
||||
}
|
||||
postData = {
|
||||
text,
|
||||
embed: {
|
||||
$type: 'app.bsky.embed.images',
|
||||
images: [{
|
||||
alt: photo.description,
|
||||
image: blobResponse.data.blob
|
||||
}]
|
||||
}
|
||||
};
|
||||
try {
|
||||
await this.bskyAgent.post(postData);
|
||||
this.log.info(`Posted ${photo.description} (${photo.name})`);
|
||||
console.dir(photo);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error making Bluesky post`, err);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
await this.db.confirmBsky(photo.id);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Could not confirm that photo ${photo.name} was posted`, err);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
new Post();
|
||||
//# sourceMappingURL=post.js.map
|
|
@ -0,0 +1 @@
|
|||
{"version":3,"file":"post.js","sourceRoot":"","sources":["../src/post.ts"],"names":[],"mappings":"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"}
|
|
@ -0,0 +1,7 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
source .env
|
||||
|
||||
node dist/post
|
|
@ -131,6 +131,30 @@ export class DB {
|
|||
return rows;
|
||||
}
|
||||
|
||||
public async getBsky () : Promise<Photo> {
|
||||
const query : string = `SELECT * FROM photos WHERE bsky = 0 ORDER BY score ASC, created DESC LIMIT 1;`;
|
||||
let rows : Photo[] = [];
|
||||
try {
|
||||
rows = await this.all(query);
|
||||
} catch (err) {
|
||||
this.log.error(`Error getting all photos`, err);
|
||||
}
|
||||
if (rows.length === 0) {
|
||||
return null;
|
||||
}
|
||||
return rows[0];
|
||||
}
|
||||
|
||||
public async confirmBsky (id : string) {
|
||||
const query : string = `UPDATE photos SET bsky = 1 WHERE id = ?;`;
|
||||
|
||||
try {
|
||||
await this.run(query, [ id ]);
|
||||
} catch (err) {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
public async cacheLocation (location : string, latlng : LatLng) {
|
||||
const query : string = `INSERT OR IGNORE INTO geocode (location, latitude, longitude) VALUES (?, ?, ?);`;
|
||||
try {
|
||||
|
|
|
@ -0,0 +1,119 @@
|
|||
import 'dotenv/config';
|
||||
|
||||
import { createLog } from './log';
|
||||
import type { Logger } from 'winston';
|
||||
import { readFile } from 'fs/promises';
|
||||
import { join } from 'path';
|
||||
import { BskyAgent } from '@atproto/api';
|
||||
import type CallOptions from '@atproto/api';
|
||||
|
||||
import { DB } from './db';
|
||||
import type { Photo } from './db';
|
||||
import { envString } from './env';
|
||||
|
||||
class Post {
|
||||
private log : Logger = createLog('post');
|
||||
private db : DB = new DB();
|
||||
private bskyAgent : BskyAgent = new BskyAgent({ service: 'https://bsky.social' });
|
||||
|
||||
constructor () {
|
||||
this.post();
|
||||
}
|
||||
|
||||
private async post () {
|
||||
await this.bsky();
|
||||
}
|
||||
|
||||
private bskyDescription (photo : Photo) : string {
|
||||
return `${photo.description}
|
||||
|
||||
${photo.format}${photo.filmstock !== 'Unknown' ? ' - ' + photo.filmstock : ''}`;
|
||||
}
|
||||
|
||||
private async bsky () {
|
||||
const photo : Photo = await this.db.getBsky();
|
||||
const identifier : string = envString('BSKY_USER', null);
|
||||
const password : string = envString('BSKY_PASSWORD', null);
|
||||
let text : string;
|
||||
let post : any;
|
||||
let imagePath : string;
|
||||
let imageData : Buffer;
|
||||
let blobResponse : any;
|
||||
let postData : any;
|
||||
|
||||
if (identifier === null || password === null) {
|
||||
this.log.error(`Cannot post without Bluesky username or password`);
|
||||
return;
|
||||
}
|
||||
|
||||
if (photo === null) {
|
||||
this.log.warn(`Nothing to post`);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await this.bskyAgent.login({ identifier, password });
|
||||
this.log.info(`Logged into Bluesky`);
|
||||
} catch (err) {
|
||||
this.log.error(`Error logging into Bluesky`, err);
|
||||
return;
|
||||
}
|
||||
|
||||
text = this.bskyDescription(photo);
|
||||
/*
|
||||
embed: {
|
||||
images: [
|
||||
{
|
||||
image: testUpload.data.blob,
|
||||
alt: "",
|
||||
},
|
||||
],
|
||||
$type: "app.bsky.embed.images",
|
||||
},
|
||||
*/
|
||||
imagePath = join(envString('WWW', './www'), 'img', `${photo.id}_full.jpg`);
|
||||
|
||||
try {
|
||||
imageData = await readFile(imagePath);
|
||||
} catch (err) {
|
||||
this.log.error(`Error reading image data ${imagePath}`, err);
|
||||
}
|
||||
|
||||
try {
|
||||
blobResponse = await this.bskyAgent.uploadBlob(imageData, { contentType: 'image/jpeg' } as any)
|
||||
} catch (err) {
|
||||
this.log.error(`Error uploading blob to Bluesky`, err);
|
||||
return;
|
||||
}
|
||||
|
||||
postData = {
|
||||
text,
|
||||
embed: {
|
||||
$type: 'app.bsky.embed.images',
|
||||
images: [{
|
||||
alt: photo.description,
|
||||
image: blobResponse.data.blob
|
||||
}]
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
await this.bskyAgent.post(postData);
|
||||
this.log.info(`Posted ${photo.description} (${photo.name})`);
|
||||
console.dir(photo);
|
||||
} catch (err) {
|
||||
this.log.error(`Error making Bluesky post`, err);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await this.db.confirmBsky(photo.id);
|
||||
} catch (err) {
|
||||
this.log.error(`Could not confirm that photo ${photo.name} was posted`, err);
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
new Post();
|
|
@ -10,6 +10,7 @@
|
|||
"baseUrl" : "dist",
|
||||
"outDir": "./dist/",
|
||||
"rootDir" : "./src/",
|
||||
"skipLibCheck": true,
|
||||
"paths" : {
|
||||
}
|
||||
},
|
||||
|
|
Loading…
Reference in New Issue