Support Reddit gallery posts
This commit is contained in:
1 parent
5c9839926d
commit
7db60e8839
2 files changed
+118
No files matched your search
@@ -69,6 +69,51 @@ describe('RedditApiClient', () => {
|
||||
expect(url).toBe('http://i.redd.it/image.jpg');
|
||||
});
|
||||
|
||||
it('extracts the first valid image from a Reddit gallery in display order', () => {
|
||||
const post = validPostFactory({
|
||||
url: 'https://www.reddit.com/gallery/t3_gallery',
|
||||
is_gallery: true,
|
||||
gallery_data: {
|
||||
items: [
|
||||
{ media_id: 'second-in-metadata' },
|
||||
{ media_id: 'first-in-metadata' },
|
||||
],
|
||||
},
|
||||
media_metadata: {
|
||||
'first-in-metadata': {
|
||||
status: 'valid',
|
||||
m: 'image/jpg',
|
||||
s: { u: 'https://i.redd.it/first.jpg' },
|
||||
},
|
||||
'second-in-metadata': {
|
||||
status: 'valid',
|
||||
m: 'image/jpg',
|
||||
s: { u: 'https://preview.redd.it/second.jpg?width=1080&format=pjpg' },
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
expect(client.getImageUrl(post)).toBe(
|
||||
'https://preview.redd.it/second.jpg?width=1080&format=pjpg',
|
||||
);
|
||||
});
|
||||
|
||||
it('ignores invalid and non-image gallery media', () => {
|
||||
const post = validPostFactory({
|
||||
url: 'https://www.reddit.com/gallery/t3_gallery',
|
||||
is_gallery: true,
|
||||
gallery_data: {
|
||||
items: [{ media_id: 'invalid' }, { media_id: 'video' }],
|
||||
},
|
||||
media_metadata: {
|
||||
invalid: { status: 'failed', m: 'image/jpg', s: { u: 'https://i.redd.it/invalid.jpg' } },
|
||||
video: { status: 'valid', m: 'video/mp4', s: { u: 'https://v.redd.it/video.mp4' } },
|
||||
},
|
||||
});
|
||||
|
||||
expect(client.getImageUrl(post)).toBeNull();
|
||||
});
|
||||
|
||||
it('accepts posts with i.redd.it URLs', () => {
|
||||
const post = validPostFactory({ url: 'https://i.redd.it/abc123.jpg' });
|
||||
const url = client.getImageUrl(post);
|
||||
@@ -615,6 +660,42 @@ describe('RedditApiClient', () => {
|
||||
expect(result[0].title).toBe('Image post 1');
|
||||
});
|
||||
|
||||
it('keeps Reddit gallery posts whose images are stored in media metadata', async () => {
|
||||
const galleryPost: RedditPost = {
|
||||
id: 't3_gallery',
|
||||
name: 't3_gallery',
|
||||
subreddit: 'test',
|
||||
author: 'gallery-user',
|
||||
title: 'Gallery post',
|
||||
url: 'https://www.reddit.com/gallery/t3_gallery',
|
||||
permalink: '/r/test/comments/t3_gallery/gallery_post',
|
||||
thumbnail: 'nsfw',
|
||||
is_self: false,
|
||||
is_gallery: true,
|
||||
gallery_data: { items: [{ media_id: 'media-1' }] },
|
||||
media_metadata: {
|
||||
'media-1': {
|
||||
status: 'valid',
|
||||
m: 'image/jpg',
|
||||
s: { u: 'https://preview.redd.it/gallery-image.jpg' },
|
||||
},
|
||||
},
|
||||
created_utc: 1000000,
|
||||
over_18: true,
|
||||
spoiler: false,
|
||||
};
|
||||
const mockAxios = {
|
||||
get: vi.fn().mockResolvedValue({
|
||||
data: { data: { children: [{ data: galleryPost }] } },
|
||||
}),
|
||||
};
|
||||
vi.mocked(axios.create).mockReturnValue(mockAxios as unknown as AxiosInstance);
|
||||
const client2 = new RedditApiClient(getTestConfig(), logger);
|
||||
|
||||
await expect(client2.getNewPosts('test')).resolves.toEqual([galleryPost]);
|
||||
expect(client2.getImageUrl(galleryPost)).toBe('https://preview.redd.it/gallery-image.jpg');
|
||||
});
|
||||
|
||||
it('filters out deleted authors', async () => {
|
||||
const mockResponse = {
|
||||
data: { data: { children: [
|
||||
|
||||
Reference in new issue
Block a user