diff --git a/docs/cli.md b/docs/cli.md index 9d25110..41abac8 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -26,6 +26,7 @@ $ random-bunny Archived = false Author = Rabbit_Owner Downvotes = 0 +Gallery = https://i.redd.it/sfz0srdrimjc1.png, https://i.redd.it/sfz0srdrimjc1.png Hidden = false Permalink = /r/Rabbits/comments/1av1rg9/cute_baby_bun/ Subreddit = Rabbits @@ -35,6 +36,8 @@ Upvotes = 211 Url = https://i.redd.it/sfz0srdrimjc1.png ``` +- The `Gallery` field is only shown when there is more than 1 image returned, which then the `Url` field is the first image of that list. + ## Help The command also includes a help option in case you are stuck. @@ -72,9 +75,11 @@ $ random-bunny --json $ randon-bunny -j -{"Archived":false,"Author":"Rabbit_Owner","Downs":0,"Hidden":false,"Permalink":"/r/Rabbits/comments/1av1rg9/cute_baby_bun/","Subreddit":"Rabbits","SubredditSubscribers":486085,"Title":"Cute baby bun","Ups":210,"Url":"https://i.redd.it/sfz0srdrimjc1.png"} +{"Archived":false,"Author":"Rabbit_Owner","Downs":0,"Hidden":false,"Permalink":"/r/Rabbits/comments/1av1rg9/cute_baby_bun/","Subreddit":"Rabbits","SubredditSubscribers":486085,"Title":"Cute baby bun","Ups":210,"Url":"https://i.redd.it/sfz0srdrimjc1.png","Gallery":["https://i.redd.it/sfz0srdrimjc1.png"]} ``` +- The `Url` field is the first image of the `Gallery` array + ## Sort You can also choose the sorting option which reddit will use to return the available posts to randomise from. diff --git a/readme.md b/readme.md index e7ba49c..570625a 100644 --- a/readme.md +++ b/readme.md @@ -39,6 +39,7 @@ The json string which gets returned consists of: - archived - author - downs +- gallery - hidden - permalink - subreddit diff --git a/src/contracts/IRedditResult.ts b/src/contracts/IRedditResult.ts index 13fef75..2c78e78 100644 --- a/src/contracts/IRedditResult.ts +++ b/src/contracts/IRedditResult.ts @@ -2,11 +2,12 @@ export default interface IRedditResult { Archived: boolean, Author: string, Downs: number, + Gallery: string[], Hidden: boolean, Permalink: string, Subreddit: string, SubredditSubscribers: number, Title: string, Ups: number, - Url: string + Url: string, } \ No newline at end of file diff --git a/src/helpers/imageHelper.ts b/src/helpers/imageHelper.ts index 3da0fc9..5c096ea 100644 --- a/src/helpers/imageHelper.ts +++ b/src/helpers/imageHelper.ts @@ -2,17 +2,19 @@ import fetch from "got-cjs"; import * as htmlparser from "htmlparser2"; export default class ImageHelper { - public static async FetchImageFromRedditGallery(url: string): Promise { + public static async FetchImageFromRedditGallery(url: string): Promise { const fetched = await fetch(url); if (!fetched || fetched.errored || fetched.statusCode != 200) { - return undefined; + return []; } const dom = htmlparser.parseDocument(fetched.body); - const img = htmlparser.DomUtils.findOne((x => x.tagName == "img" && x.attributes.find(y => y.value.includes("https://preview.redd.it")) != null), dom.children, true); + const img = htmlparser.DomUtils.findAll((x => x.tagName == "img" && x.attributes.find(y => y.value.includes("https://preview.redd.it")) != null), dom.children); - const imgSrc = img?.attributes.find(x => x.name == "src")?.value; + const imgSrc = img + .flatMap(x => x.attributes.find(x => x.name == "src")?.value) + .filter(x => x != undefined); return imgSrc; } diff --git a/src/index.ts b/src/index.ts index 056fe1f..b9ed5f9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -93,6 +93,7 @@ export default async function randomBunny(subreddit: string, sortBy: "new" | "ho const randomData = randomSelect.data; let url: string; + let gallery: string[]; if (randomData.url.includes("/gallery")) { const galleryImage = await ImageHelper.FetchImageFromRedditGallery(randomData.url); @@ -112,9 +113,11 @@ export default async function randomBunny(subreddit: string, sortBy: "new" | "ho } } - url = galleryImage; + url = galleryImage[0]; + gallery = galleryImage; } else { url = randomData.url; + gallery = [randomData.url]; } const redditResult: IRedditResult = { @@ -128,6 +131,7 @@ export default async function randomBunny(subreddit: string, sortBy: "new" | "ho Title: randomData['title'], Ups: randomData['ups'], Url: url, + Gallery: gallery, }; return { diff --git a/tests/helpers/__snapshots__/outputHelper.test.ts.snap b/tests/helpers/__snapshots__/outputHelper.test.ts.snap index ff9175a..a044c01 100644 --- a/tests/helpers/__snapshots__/outputHelper.test.ts.snap +++ b/tests/helpers/__snapshots__/outputHelper.test.ts.snap @@ -10,10 +10,11 @@ Subreddit = Rabbits SubredditSubscribers = 654751 Title = This is my Ms Bear! Ups = 17 -Url = https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d" +Url = https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d +Gallery = https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d" `; -exports[`GenerateOutput GIVEN options.json is true, EXPECT output to be returned as JSON 1`] = `"{"Archived":false,"Author":"author","Downs":0,"Hidden":false,"Permalink":"/r/Rabbits/comments/1dj8pbt/this_is_my_ms_bear/","Subreddit":"Rabbits","SubredditSubscribers":654751,"Title":"This is my Ms Bear!","Ups":17,"Url":"https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d"}"`; +exports[`GenerateOutput GIVEN options.json is true, EXPECT output to be returned as JSON 1`] = `"{"Archived":false,"Author":"author","Downs":0,"Hidden":false,"Permalink":"/r/Rabbits/comments/1dj8pbt/this_is_my_ms_bear/","Subreddit":"Rabbits","SubredditSubscribers":654751,"Title":"This is my Ms Bear!","Ups":17,"Url":"https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d","Gallery":["https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d"]}"`; exports[`GenerateOutput GIVEN options.queryMetadata AND options.json is supplied, EXPECT query metadata to be in JSON format 1`] = `"{"Archived":false,"Author":"author","Downs":0,"Hidden":false,"Permalink":"/r/Rabbits/comments/1dj8pbt/this_is_my_ms_bear/","Subreddit":"Rabbits","SubredditSubscribers":654751,"Title":"This is my Ms Bear!","Ups":17,"Url":"https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d","subreddit":"rabbits","sortBy":"hot","limit":100}"`; @@ -28,6 +29,7 @@ SubredditSubscribers = 654751 Title = This is my Ms Bear! Ups = 17 Url = https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d +Gallery = https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d subreddit = rabbits sortBy = hot limit = 100" diff --git a/tests/helpers/imageHelper.test.ts b/tests/helpers/imageHelper.test.ts index 3c6f44e..3eeb789 100644 --- a/tests/helpers/imageHelper.test.ts +++ b/tests/helpers/imageHelper.test.ts @@ -17,18 +17,19 @@ describe("FetchImageFromRedditGallery", () => { expect(fetchMock).toHaveBeenCalledTimes(1); expect(fetchMock).toHaveBeenCalledWith("https://redd.it/gallery/image"); - expect(result).toBe("https://preview.redd.it/image.png"); + expect(result.length).toBe(1); + expect(result[0]).toBe("https://preview.redd.it/image.png"); }); - test("GIVEN fetch is unable to return data, EXPECT undefined returned", async () => { + test("GIVEN fetch is unable to return data, EXPECT empty array returned", async () => { fetchMock.mockResolvedValue(null); const result = await ImageHelper.FetchImageFromRedditGallery("https://redd.it/gallery/image"); - expect(result).toBeUndefined(); + expect(result.length).toBe(0); }); - test("GIVEN fetch is an error, EXPECT undefined returned", async () => { + test("GIVEN fetch is an error, EXPECT empty array returned", async () => { fetchMock.mockResolvedValue({ body: "", errored: "Error", @@ -37,10 +38,10 @@ describe("FetchImageFromRedditGallery", () => { const result = await ImageHelper.FetchImageFromRedditGallery("https://redd.it/gallery/image"); - expect(result).toBeUndefined(); + expect(result.length).toBe(0); }); - test("GIVEN fetch is not status code of 200, EXPECT undefined returned", async () => { + test("GIVEN fetch is not status code of 200, EXPECT empty array returned", async () => { fetchMock.mockResolvedValue({ body: "", errored: undefined, @@ -49,10 +50,10 @@ describe("FetchImageFromRedditGallery", () => { const result = await ImageHelper.FetchImageFromRedditGallery("https://redd.it/gallery/image"); - expect(result).toBeUndefined(); + expect(result.length).toBe(0); }); - test("GIVEN image tag is not found, EXPECT undefined returned", async () => { + test("GIVEN image tag is not found, EXPECT empty array returned", async () => { fetchMock.mockResolvedValue({ body: "", errored: undefined, @@ -61,10 +62,10 @@ describe("FetchImageFromRedditGallery", () => { const result = await ImageHelper.FetchImageFromRedditGallery("https://redd.it/gallery/image"); - expect(result).toBeUndefined(); + expect(result.length).toBe(0); }); - test("GIVEN image source attribute is not found, EXPECT undefined returned", async () => { + test("GIVEN image source attribute is not found, EXPECT empty array returned", async () => { fetchMock.mockResolvedValue({ body: "", errored: undefined, @@ -73,10 +74,10 @@ describe("FetchImageFromRedditGallery", () => { const result = await ImageHelper.FetchImageFromRedditGallery("https://redd.it/gallery/image"); - expect(result).toBeUndefined(); + expect(result.length).toBe(0); }); - test("GIVEN image source attribute is not found that is a preview.redd.it url, EXPECT undefined returned", async () => { + test("GIVEN image source attribute is not found that is a preview.redd.it url, EXPECT empty array returned", async () => { fetchMock.mockResolvedValue({ body: "", errored: undefined, @@ -85,6 +86,6 @@ describe("FetchImageFromRedditGallery", () => { const result = await ImageHelper.FetchImageFromRedditGallery("https://redd.it/gallery/image"); - expect(result).toBeUndefined(); + expect(result.length).toBe(0); }); }); \ No newline at end of file diff --git a/tests/helpers/outputHelper.test.ts b/tests/helpers/outputHelper.test.ts index 24bd1cd..049e813 100644 --- a/tests/helpers/outputHelper.test.ts +++ b/tests/helpers/outputHelper.test.ts @@ -23,6 +23,7 @@ describe("GenerateOutput", () => { Title: "This is my Ms Bear!", Ups: 17, Url: "https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d", + Gallery: ["https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d"], }, } as IReturnResult; @@ -55,6 +56,7 @@ describe("GenerateOutput", () => { Title: "This is my Ms Bear!", Ups: 17, Url: "https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d", + Gallery: ["https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d"], }, } as IReturnResult; @@ -89,6 +91,7 @@ describe("GenerateOutput", () => { Title: "This is my Ms Bear!", Ups: 17, Url: "https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d", + Gallery: ["https://preview.redd.it/d5yno653zf7d1.jpg?width=640&crop=smart&auto=webp&s=5064d1caec3c12ac2855eb57ff131d0b313d5e9d"], }, } as IReturnResult;