diff --git a/README.md b/README.md index 0e2a45c..67ab969 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# **Aruppi API** (v4.1.2) +# **Aruppi API** (v4.1.3) > This API has everything about Japan, from anime, music, radio, images, videos ... to japanese culture > diff --git a/package-lock.json b/package-lock.json index f18c41c..80239c3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "aruppi", - "version": "4.1.2", + "version": "4.1.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "aruppi", - "version": "4.1.2", + "version": "4.1.3", "license": "MIT", "dependencies": { "body-parser": "^1.19.0", @@ -642,9 +642,9 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { "node": ">=8" @@ -3061,9 +3061,9 @@ } }, "node_modules/nth-check": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", - "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", "dependencies": { "boolbase": "^1.0.0" }, @@ -4951,9 +4951,9 @@ "dev": true }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { @@ -6753,9 +6753,9 @@ "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" }, "nth-check": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", - "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", "requires": { "boolbase": "^1.0.0" } diff --git a/package.json b/package.json index ff1770d..b7defbf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aruppi", - "version": "4.1.2", + "version": "4.1.3", "description": "Aruppi is a custom API to obtain data from the Japanese culture for the mobile app", "main": "./src/api/api.ts", "scripts": { diff --git a/src/controllers/UtilsController.ts b/src/controllers/UtilsController.ts index 1c9f813..0a60935 100644 --- a/src/controllers/UtilsController.ts +++ b/src/controllers/UtilsController.ts @@ -330,6 +330,65 @@ export default class UtilsController { } } + async getPlaylists(req: Request, res: Response, next: NextFunction) { + + const { playlistId } = req.params; + let data: any; + + try { + if (redisClient.connected) { + + const resultQueryRedis: any = redisClient.get( + `playlist_videos_${hashStringMd5(playlistId)}`, + ); + + if (resultQueryRedis) { + const resultRedis: any = JSON.parse(resultQueryRedis); + return res.status(200).json(resultRedis); + } + } + + data = await requestGot( + `${urls.BASE_YOUTUBE_PLAYLIST}${playlistId}`, + { scrapy: false, parse: true }, + ); + } catch (err) { + return next(err); + } + + const results: any[] = data.items.map((item: any) => { + return { + title: item.snippet.title, + videoId: item.id.videoId, + thumbDefault: item.snippet.thumbnails.default.url, + thumbMedium: item.snippet.thumbnails.medium.url, + thumbHigh: item.snippet.thumbnails.high.url, + }; + }); + + if (results.length > 0) { + if (redisClient.connected) { + /!* Set the key in the redis cache. *!/ + + redisClient.set( + `playlist_videos_${hashStringMd5(playlistId)}`, + JSON.stringify({ videos: results }), + ); + + /!* After 24hrs expire the key. *!/ + + redisClient.expireat( + `playlist_videos_${hashStringMd5(playlistId)}`, + parseInt(`${+new Date() / 1000}`, 10) + 7200, + ); + } + + res.status(200).json({ videos: results }); + } else { + res.status(500).json({ message: 'Aruppi lost in the shell' }); + } + } + async getSectionVideos(req: Request, res: Response, next: NextFunction) { const { type } = req.params; let y1: any, y2: any, y3: any; diff --git a/src/routes.ts b/src/routes.ts index 8744681..0ca0c51 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -52,6 +52,7 @@ routes.get('/api/v4/', (req: Request, res: Response) => { Search: '/api/v4/search/:title', Images: '/api/v4/images/:query', Videos: '/api/v4/videos/:channelId', + Playlist: '/api/v4/playlistVideos/:playlistId', 'Type Videos': '/api/v4/sectionedVideos/:type', Radios: '/api/v4/radio', 'All Themes': '/api/v4/allThemes', @@ -104,6 +105,7 @@ routes.get('/api/v4/anitakume', utilsController.getAnitakume); routes.get('/api/v4/news', utilsController.getNews); routes.get('/api/v4/images/:title', utilsController.getImages); routes.get('/api/v4/videos/:channelId', utilsController.getVideos); +routes.get('/api/v4/playlistVideos/:playlistId', utilsController.getPlaylists); routes.get('/api/v4/sectionedVideos/:type', utilsController.getSectionVideos); routes.get('/api/v4/radio', utilsController.getRadioStations); routes.get('/api/v4/allThemes', utilsController.getAllThemes); diff --git a/src/utils/urls.ts b/src/utils/urls.ts index 7271cce..6d012f0 100644 --- a/src/utils/urls.ts +++ b/src/utils/urls.ts @@ -6,6 +6,7 @@ export default { BASE_JKANIME: 'https://jkanime.net/', BASE_ANIMEFLV_JELU: 'https://aruppi.jeluchu.xyz/apis/animeflv/v1/', BASE_YOUTUBE: 'https://aruppi.jeluchu.xyz/api/Youtube/?channelId=', + BASE_YOUTUBE_PLAYLIST: 'https://aruppi.jeluchu.xyz/api/Youtube/playlist/?playlistId=', BASE_JIKAN: 'https://aruppi.jeluchu.xyz/apis/jikan/v3/', BASE_IVOOX: 'https://www.ivoox.com/podcast-anitakume_fg_f1660716_filtro_1.xml', diff --git a/yarn.lock b/yarn.lock index 9898b24..f8f0fac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -353,9 +353,9 @@ "version" "4.1.1" "ansi-regex@^5.0.0": - "integrity" "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz" - "version" "5.0.0" + "integrity" "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + "version" "5.0.1" "ansi-styles@^3.2.1": "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" @@ -1900,9 +1900,9 @@ "version" "6.1.0" "nth-check@^2.0.0": - "integrity" "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==" - "resolved" "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz" - "version" "2.0.0" + "integrity" "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==" + "resolved" "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz" + "version" "2.0.1" dependencies: "boolbase" "^1.0.0"