import { BasePlatform, type ActorConfig } from './base.js';
import type { UnifiedPost } from '../types.js';
export class RedditPlatform extends BasePlatform {
readonly config: ActorConfig = {
actorId: 'trudax/reddit-scraper-lite',
platform: 'reddit',
defaultMaxResults: 50,
};
buildInput(params: Record<string, unknown>): Record<string, unknown> {
const input: Record<string, unknown> = {
maxItems: params.max_results ?? this.config.defaultMaxResults,
};
if (params.subreddits) {
input.startUrls = (params.subreddits as string[]).map(sub => ({
url: sub.startsWith('http') ? sub : `https://www.reddit.com/r/${sub}/`,
}));
}
if (params.search) {
input.searches = [{ term: params.search as string }];
}
if (params.urls) {
input.startUrls = (params.urls as string[]).map(url => ({ url }));
}
return input;
}
normalize(raw: Record<string, unknown>[]): UnifiedPost[] {
return raw.map(item => {
const title = this.safeString(item.title ?? '');
const body = this.safeString(item.body ?? item.selftext ?? item.text ?? '');
const combined = body ? `${title}\n\n${body}` : title;
return {
id: this.makeId(this.safeString(item.id ?? item.postId ?? '')),
platform: 'reddit' as const,
author: {
username: this.safeString(item.author ?? item.username ?? ''),
displayName: this.safeString(item.author ?? item.username ?? ''),
followers: undefined,
verified: false,
},
content: combined,
url: this.safeString(item.url ?? item.postUrl ?? ''),
timestamp: this.safeDate(item.createdAt ?? item.created_utc ?? item.date),
engagement: {
likes: this.safeNumber(item.score ?? item.ups),
comments: this.safeNumber(item.numberOfComments ?? item.numComments ?? item.num_comments),
shares: 0,
views: 0,
},
hashtags: this.extractHashtags(combined),
metadata: {
subreddit: item.subreddit ?? item.communityName,
flair: item.flair ?? item.linkFlair,
upvoteRatio: item.upvoteRatio ?? item.upvote_ratio,
isNSFW: item.over_18 ?? item.isNSFW,
isPinned: item.stickied ?? item.isPinned,
},
};
});
}
}