mirror of
https://github.com/profullstack/logicsrc.git
synced 2026-08-14 14:57:28 +00:00
Add feed discovery plugin
This commit is contained in:
parent
e47616bf9d
commit
5cfeea6b57
37 changed files with 2432 additions and 5 deletions
38
plugins/feed-discovery/src/dedupe.ts
Normal file
38
plugins/feed-discovery/src/dedupe.ts
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
import type { DiscoveredFeed } from "./types.js";
|
||||
import { canonicalizeUrl } from "./url-safety.js";
|
||||
|
||||
export function dedupeFeeds(feeds: DiscoveredFeed[]) {
|
||||
const byKey = new Map<string, DiscoveredFeed>();
|
||||
|
||||
for (const feed of feeds) {
|
||||
const key = dedupeKey(feed);
|
||||
const existing = byKey.get(key);
|
||||
if (!existing || feed.score > existing.score || feed.confidence > existing.confidence) {
|
||||
byKey.set(key, mergeFeed(existing, feed));
|
||||
}
|
||||
}
|
||||
|
||||
return [...byKey.values()].sort((a, b) => b.score - a.score || b.confidence - a.confidence);
|
||||
}
|
||||
|
||||
function dedupeKey(feed: DiscoveredFeed) {
|
||||
const feedUrl = feed.canonicalFeedUrl || feed.feedUrl;
|
||||
try {
|
||||
return `feed:${canonicalizeUrl(feedUrl)}`;
|
||||
} catch {
|
||||
return `feed:${feedUrl.toLowerCase()}`;
|
||||
}
|
||||
}
|
||||
|
||||
function mergeFeed(existing: DiscoveredFeed | undefined, next: DiscoveredFeed): DiscoveredFeed {
|
||||
if (!existing) {
|
||||
return next;
|
||||
}
|
||||
|
||||
return {
|
||||
...existing,
|
||||
...next,
|
||||
tags: [...new Set([...existing.tags, ...next.tags])],
|
||||
sampleItems: next.sampleItems?.length ? next.sampleItems : existing.sampleItems
|
||||
};
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue