diff --git a/pyworker/pyworker/scheduler.py b/pyworker/pyworker/scheduler.py index bd6164f..b764949 100644 --- a/pyworker/pyworker/scheduler.py +++ b/pyworker/pyworker/scheduler.py @@ -126,9 +126,9 @@ class TaskScheduler: self.logger.info(f"Running task '{task_name}'") # Use task instance as a context manager to ensure # a single database connection is used for the entire task - with task_info["instance"] as task_instance: - # Execute the task instance's run method directly - task_instance.run() + with task_info["instance"]: + # Execute the registered task function with its arguments + task_info["func"](*task_info["args"], **task_info["kwargs"]) self.logger.info(f"Task '{task_name}' completed") except Exception as e: self.logger.exception(f"Error running task '{task_name}': {e}") diff --git a/web/src/assets/ogimage-bg.png b/web/src/assets/ogimage-bg.png new file mode 100644 index 0000000..8dd5d12 Binary files /dev/null and b/web/src/assets/ogimage-bg.png differ diff --git a/web/src/components/OgImage.tsx b/web/src/components/OgImage.tsx index 4908c34..2676339 100644 --- a/web/src/components/OgImage.tsx +++ b/web/src/components/OgImage.tsx @@ -3,8 +3,11 @@ import path from 'node:path' import { ImageResponse } from '@vercel/og' +import defaultOGImageBg from '../assets/ogimage-bg.png' +import defaultOGImage from '../assets/ogimage.png' import { urlWithParams } from '../lib/urls' +import type { APIContext } from 'astro' import type { Prettify } from 'ts-essentials' export type GenericOgImageProps = Partial> @@ -52,19 +55,26 @@ const defaultOptions = { ], } as const satisfies ConstructorParameters[1] -const defaultOGImageData = fs.readFileSync(path.resolve(process.cwd(), 'src', 'assets', 'ogimage.png')) +function absoluteUrl(url: string, context: Pick) { + return new URL(url, context.url.origin).href +} export const ogImageTemplates = { - default: () => { - return new Response(Buffer.from(defaultOGImageData), { - status: 200, - headers: { - 'Content-Type': 'image/png', - 'Cache-Control': 'public, max-age=604800', // Cache for 1 week - }, - }) + default: (_props: Record = {}, context: APIContext) => { + return new ImageResponse( + ( + + ), + defaultOptions + ) }, - generic: ({ title }: { title?: string }) => { + generic: ({ title }: { title?: string }, context) => { return new ImageResponse( (
{title} - - -
), defaultOptions ) }, -} as const satisfies Record ImageResponse | null> +} as const satisfies Record ImageResponse | null> type OgImageTemplate = keyof typeof ogImageTemplates type OgImageProps = Parameters<(typeof ogImageTemplates)[T]>[0] diff --git a/web/src/pages/ogimage.png.ts b/web/src/pages/ogimage.png.ts index 211baa9..4eeae71 100644 --- a/web/src/pages/ogimage.png.ts +++ b/web/src/pages/ogimage.png.ts @@ -3,21 +3,21 @@ import { urlParamsToObject } from '../lib/urls' import type { APIRoute } from 'astro' -export const GET: APIRoute = ({ url }) => { - const { template, ...props } = urlParamsToObject(url.searchParams) +export const GET: APIRoute = (context) => { + const { template, ...props } = urlParamsToObject(context.url.searchParams) - if (!template) return ogImageTemplates.default() + if (!template) return ogImageTemplates.default({}, context) if (!(template in ogImageTemplates)) { console.error(`Invalid template: "${template}"`) - return ogImageTemplates.default() + return ogImageTemplates.default({}, context) } - const response = ogImageTemplates[template as keyof typeof ogImageTemplates](props) + const response = ogImageTemplates[template as keyof typeof ogImageTemplates](props, context) // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (!response) { console.error(`Cannot generate image for template: ${template} and props: ${JSON.stringify(props)}`) - return ogImageTemplates.default() + return ogImageTemplates.default({}, context) } return response