Improve formatting
This commit is contained in:
@ -1,10 +1,17 @@
|
||||
import { HASHTAG_FILTER, MASTODON_INSTANCE, URL_FILTER, YOUTUBE_API_KEY } from '$env/static/private';
|
||||
import {
|
||||
HASHTAG_FILTER,
|
||||
MASTODON_INSTANCE,
|
||||
URL_FILTER,
|
||||
YOUTUBE_API_KEY
|
||||
} from '$env/static/private';
|
||||
import type { Post, Tag, TimelineEvent } from '$lib/mastodon/response';
|
||||
import { getPosts, savePost } from '$lib/server/db';
|
||||
import { createFeed, saveAtomFeed } from '$lib/server/rss';
|
||||
import { WebSocket } from "ws";
|
||||
import { WebSocket } from 'ws';
|
||||
|
||||
const YOUTUBE_REGEX = new RegExp(/https?:\/\/(www\.)?youtu((be.com\/.*?v=)|(\.be\/))(?<videoId>[a-zA-Z_0-9-]+)/gm);
|
||||
const YOUTUBE_REGEX = new RegExp(
|
||||
/https?:\/\/(www\.)?youtu((be.com\/.*?v=)|(\.be\/))(?<videoId>[a-zA-Z_0-9-]+)/gm
|
||||
);
|
||||
|
||||
export class TimelineReader {
|
||||
private static _instance: TimelineReader;
|
||||
@ -13,7 +20,8 @@ export class TimelineReader {
|
||||
const searchParams = new URLSearchParams([
|
||||
['part', 'snippet'],
|
||||
['id', videoId],
|
||||
['key', YOUTUBE_API_KEY]]);
|
||||
['key', YOUTUBE_API_KEY]
|
||||
]);
|
||||
const youtubeVideoUrl = new URL(`https://www.googleapis.com/youtube/v3/videos?${searchParams}`);
|
||||
const resp = await fetch(youtubeVideoUrl);
|
||||
const respObj = await resp.json();
|
||||
@ -30,15 +38,20 @@ export class TimelineReader {
|
||||
const categorySearchParams = new URLSearchParams([
|
||||
['part', 'snippet'],
|
||||
['id', item.categoryId],
|
||||
['key', YOUTUBE_API_KEY]]);
|
||||
const youtubeCategoryUrl = new URL(`https://www.googleapis.com/youtube/v3/videoCategories?${categorySearchParams}`);
|
||||
const categoryTitle: string = await fetch(youtubeCategoryUrl).then(r => r.json()).then(r => r.items[0]?.title);
|
||||
['key', YOUTUBE_API_KEY]
|
||||
]);
|
||||
const youtubeCategoryUrl = new URL(
|
||||
`https://www.googleapis.com/youtube/v3/videoCategories?${categorySearchParams}`
|
||||
);
|
||||
const categoryTitle: string = await fetch(youtubeCategoryUrl)
|
||||
.then((r) => r.json())
|
||||
.then((r) => r.items[0]?.title);
|
||||
return categoryTitle === 'Music';
|
||||
}
|
||||
|
||||
private static async checkYoutubeMatches(postContent: string): Promise<boolean> {
|
||||
const matches = postContent.matchAll(YOUTUBE_REGEX);
|
||||
for (let match of matches) {
|
||||
for (const match of matches) {
|
||||
if (match === undefined || match.groups === undefined) {
|
||||
continue;
|
||||
}
|
||||
@ -57,10 +70,10 @@ export class TimelineReader {
|
||||
|
||||
private constructor() {
|
||||
const socket = new WebSocket(`wss://${MASTODON_INSTANCE}/api/v1/streaming`);
|
||||
socket.onopen = (_event) => {
|
||||
socket.onopen = () => {
|
||||
socket.send('{ "type": "subscribe", "stream": "public:local"}');
|
||||
};
|
||||
socket.onmessage = (async (event) => {
|
||||
socket.onmessage = async (event) => {
|
||||
try {
|
||||
const data: TimelineEvent = JSON.parse(event.data.toString());
|
||||
if (data.event !== 'update') {
|
||||
@ -71,31 +84,30 @@ export class TimelineReader {
|
||||
const found_tags: Tag[] = post.tags.filter((t: Tag) => hashttags.includes(t.name));
|
||||
|
||||
const urls: string[] = URL_FILTER.split(',');
|
||||
const found_urls = urls.filter(t => post.content.includes(t));
|
||||
const found_urls = urls.filter((t) => post.content.includes(t));
|
||||
|
||||
// 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 (found_urls.length === 0 &&
|
||||
if (
|
||||
found_urls.length === 0 &&
|
||||
found_tags.length === 0 &&
|
||||
!await TimelineReader.checkYoutubeMatches(post.content)) {
|
||||
!(await TimelineReader.checkYoutubeMatches(post.content))
|
||||
) {
|
||||
return;
|
||||
}
|
||||
await savePost(post);
|
||||
const posts = await getPosts(null, null, 100);
|
||||
await saveAtomFeed(createFeed(posts));
|
||||
|
||||
} catch (e) {
|
||||
console.error("error message", event, event.data, e)
|
||||
console.error('error message', event, event.data, e);
|
||||
}
|
||||
|
||||
});
|
||||
};
|
||||
socket.onclose = (event) => {
|
||||
console.log("Closed", event, event.code, event.reason)
|
||||
console.log('Closed', event, event.code, event.reason);
|
||||
};
|
||||
socket.onerror = (event) => {
|
||||
console.log("error", event, event.message, event.error)
|
||||
console.log('error', event, event.message, event.error);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
public static init() {
|
||||
@ -108,4 +120,4 @@ export class TimelineReader {
|
||||
TimelineReader.init();
|
||||
return this._instance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user