chore: update search scripts, extra sources and post drafts

Adds the one-off scripts accumulated across recent sessions, removes
temp scripts whose searches now live in config.ts as role-family
sweeps, and updates fetch-other.ts plus the LinkedIn post drafts.
This commit is contained in:
2026-08-27 09:03:05 +02:00
parent 3f5360f44c
commit b4957025b1
31 changed files with 2008 additions and 283 deletions
+46
View File
@@ -0,0 +1,46 @@
#!/usr/bin/env bun
import { searches } from "../config.ts";
import { fetchJobs, isEnglishContent } from "../fetch.ts";
const CSV = "./results/jobs.csv";
const BASEL_LABELS = new Set(["Basel (city)", "Basel Metropolitan Area", "Basel-Country"]);
const existingIds = new Set<string>();
try {
const text = await Bun.file(CSV).text();
for (const line of text.split("\n").slice(1)) {
const id = line.match(/\/jobs\/view\/(\d+)\//)?.[1];
if (id) existingIds.add(id);
}
} catch { /* first run */ }
type Row = { id: string; title: string; company: string; location: string; link: string; posted: string; isNew: boolean };
const seen = new Set<string>();
const rows: Row[] = [];
for (const config of searches.filter((s) => BASEL_LABELS.has(s.label))) {
const jobs = await fetchJobs(config);
console.error(`[${config.label}] ${jobs.length} jobs`);
for (const job of jobs) {
if (seen.has(job.id)) continue;
seen.add(job.id);
rows.push({
id: job.id,
title: job.title,
company: job.company,
location: (job as any).location ?? "",
link: job.link,
posted: (job as any).postedAt ?? "",
isNew: !existingIds.has(job.id),
});
}
}
const survivors: Row[] = [];
for (const r of rows) {
if (await isEnglishContent(r.id)) survivors.push(r);
else console.error(` DE/FR content dropped: ${r.title} — ${r.company}`);
}
console.error(`\n${survivors.length} survivors (${survivors.filter((r) => r.isNew).length} new)`);
console.log(JSON.stringify(survivors, null, 2));