check for missed posts
This commit is contained in:
@ -352,6 +352,30 @@ export class TimelineReader {
|
||||
}
|
||||
}
|
||||
|
||||
private async checkAndSavePost(post: Post) {
|
||||
const hashttags: string[] = HASHTAG_FILTER.split(',');
|
||||
const found_tags: Tag[] = post.tags.filter((t: Tag) => hashttags.includes(t.name));
|
||||
|
||||
const songs = await TimelineReader.getSongInfoInPost(post);
|
||||
|
||||
// If we don't have any tags or non-youtube urls, check youtube
|
||||
// YT is handled separately, because it requires an API call and therefore is slower
|
||||
if (songs.length === 0 && found_tags.length === 0) {
|
||||
log.log('Ignoring post', post.url);
|
||||
return;
|
||||
}
|
||||
|
||||
await savePost(post, songs);
|
||||
|
||||
await TimelineReader.saveAvatar(post.account);
|
||||
await TimelineReader.saveSongThumbnails(songs);
|
||||
|
||||
log.debug('Saved post', post.url);
|
||||
|
||||
const posts = await getPosts(null, null, 100);
|
||||
await saveAtomFeed(createFeed(posts));
|
||||
}
|
||||
|
||||
private startWebsocket() {
|
||||
const socket = new WebSocket(
|
||||
`wss://${MASTODON_INSTANCE}/api/v1/streaming?type=subscribe&stream=public:local&access_token=${MASTODON_ACCESS_TOKEN}`
|
||||
@ -367,28 +391,7 @@ export class TimelineReader {
|
||||
return;
|
||||
}
|
||||
const post: Post = JSON.parse(data.payload);
|
||||
|
||||
const hashttags: string[] = HASHTAG_FILTER.split(',');
|
||||
const found_tags: Tag[] = post.tags.filter((t: Tag) => hashttags.includes(t.name));
|
||||
|
||||
const songs = await TimelineReader.getSongInfoInPost(post);
|
||||
|
||||
// If we don't have any tags or non-youtube urls, check youtube
|
||||
// YT is handled separately, because it requires an API call and therefore is slower
|
||||
if (songs.length === 0 && found_tags.length === 0) {
|
||||
log.log('Ignoring post', post.url);
|
||||
return;
|
||||
}
|
||||
|
||||
await savePost(post, songs);
|
||||
|
||||
await TimelineReader.saveAvatar(post.account);
|
||||
await TimelineReader.saveSongThumbnails(songs);
|
||||
|
||||
log.debug('Saved post', post.url);
|
||||
|
||||
const posts = await getPosts(null, null, 100);
|
||||
await saveAtomFeed(createFeed(posts));
|
||||
await this.checkAndSavePost(post);
|
||||
} catch (e) {
|
||||
log.error('error message', event, event.data, e);
|
||||
}
|
||||
@ -410,9 +413,38 @@ export class TimelineReader {
|
||||
};
|
||||
}
|
||||
|
||||
private async loadPostsSinceLastRun() {
|
||||
const now = new Date().toISOString();
|
||||
let latestPost = await getPosts(null, now, 1);
|
||||
log.log('Last post in DB since', now, latestPost);
|
||||
let u = new URL(`https://${MASTODON_INSTANCE}/api/v1/timelines/public?local=true&limit=40`);
|
||||
if (latestPost.length > 0) {
|
||||
u.searchParams.append('since_id', latestPost[0].id);
|
||||
}
|
||||
for (let tag of HASHTAG_FILTER.split(',')) {
|
||||
u.searchParams.append('q', '#' + tag);
|
||||
}
|
||||
const headers = {
|
||||
Authorization: `Bearer ${MASTODON_ACCESS_TOKEN}`
|
||||
};
|
||||
const latestPosts: Post[] = await fetch(u, { headers }).then((r) => r.json());
|
||||
log.info('searched posts', latestPosts);
|
||||
for (const post of latestPosts) {
|
||||
await this.checkAndSavePost(post);
|
||||
}
|
||||
}
|
||||
|
||||
private constructor() {
|
||||
log.log('Constructing timeline object');
|
||||
this.startWebsocket();
|
||||
|
||||
this.loadPostsSinceLastRun()
|
||||
.then((_) => {
|
||||
log.info('loaded posts since last run');
|
||||
})
|
||||
.catch((e) => {
|
||||
log.error('cannot fetch latest posts', e);
|
||||
});
|
||||
}
|
||||
|
||||
public static init() {
|
||||
|
Reference in New Issue
Block a user