diff --git a/src/utils/getVideoDetails.ts b/src/utils/getVideoDetails.ts index aa5636a..251336f 100644 --- a/src/utils/getVideoDetails.ts +++ b/src/utils/getVideoDetails.ts @@ -45,13 +45,13 @@ async function newLeafWrapper(videoId: string, ignoreCache: boolean) { export function getVideoDetails(videoId: string, ignoreCache = false): Promise { if (!config.newLeafURLs) { - return getPlayerData(videoId) + return getPlayerData(videoId, ignoreCache) .then(data => convertFromInnerTube(data)); } return Promise.any([ newLeafWrapper(videoId, ignoreCache) .then(videoData => convertFromNewLeaf(videoData)), - getPlayerData(videoId) + getPlayerData(videoId, ignoreCache) .then(data => convertFromInnerTube(data)) ]).catch(() => { return null; diff --git a/src/utils/innerTubeAPI.ts b/src/utils/innerTubeAPI.ts index c8f8696..c330e92 100644 --- a/src/utils/innerTubeAPI.ts +++ b/src/utils/innerTubeAPI.ts @@ -1,7 +1,9 @@ import axios from "axios"; +import { Logger } from "./logger"; import { innerTubeVideoDetails } from "../types/innerTubeApi.model"; +import DiskCache from "./diskCache"; -export async function getPlayerData(videoID: string): Promise { +async function getFromITube (videoID: string): Promise { // start subrequest const url = "https://www.youtube.com/youtubei/v1/player"; const data = { @@ -21,4 +23,36 @@ export async function getPlayerData(videoID: string): Promise { + if (!videoID || videoID.length !== 11 || videoID.includes(".")) { + return Promise.reject("Invalid video ID"); + } + + const cacheKey = `yt.itube.video.${videoID}`; + if (!ignoreCache) { // try fetching from cache + try { + const data = await DiskCache.get(cacheKey); + if (data) { + Logger.debug(`InnerTube API: cache used for video information: ${videoID}`); + return data as innerTubeVideoDetails; + } + } catch (err) { + return Promise.reject(err); + } + } + try { + const data = await getFromITube(videoID) + .catch(err => { + Logger.warn(`InnerTube API Error for ${videoID}: ${err}`); + return Promise.reject(err); + }); + DiskCache.set(cacheKey, data) + .then(() => Logger.debug(`InnerTube API: video information cache set for: ${videoID}`)) + .catch((err: any) => Logger.warn(err)); + return data; + } catch (err) { + return Promise.reject(err); + } } \ No newline at end of file diff --git a/test/cases/innerTubeApi.ts b/test/cases/innerTubeApi.ts index e20c4a6..0c98642 100644 --- a/test/cases/innerTubeApi.ts +++ b/test/cases/innerTubeApi.ts @@ -23,16 +23,16 @@ const currentViews = 49816; describe("innertube API test", function() { it("should be able to get innerTube details", async () => { - const result = await innerTube.getPlayerData(videoID); + const result = await innerTube.getPlayerData(videoID, true); assert.ok(partialDeepEquals(result, expectedInnerTube)); }); it("Should have more views than current", async () => { - const result = await innerTube.getPlayerData(videoID); + const result = await innerTube.getPlayerData(videoID, true); assert.ok(Number(result.viewCount) >= currentViews); }); it("Should have equivalent response from NewLeaf", async function () { if (!config.newLeafURLs || config.newLeafURLs.length <= 0 || config.newLeafURLs[0] == "placeholder") this.skip(); - const itResponse = await innerTube.getPlayerData(videoID); + const itResponse = await innerTube.getPlayerData(videoID, true); const newLeafResponse = await YouTubeAPI.listVideos(videoID, true); // validate videoID assert.strictEqual(itResponse.videoId, videoID);