add DiskCache to getPlayerData

This commit is contained in:
Michael C
2022-09-26 15:58:33 -04:00
parent 07926ada57
commit 55aa33aa6e
3 changed files with 40 additions and 6 deletions

View File

@@ -45,13 +45,13 @@ async function newLeafWrapper(videoId: string, ignoreCache: boolean) {
export function getVideoDetails(videoId: string, ignoreCache = false): Promise<videoDetails> { export function getVideoDetails(videoId: string, ignoreCache = false): Promise<videoDetails> {
if (!config.newLeafURLs) { if (!config.newLeafURLs) {
return getPlayerData(videoId) return getPlayerData(videoId, ignoreCache)
.then(data => convertFromInnerTube(data)); .then(data => convertFromInnerTube(data));
} }
return Promise.any([ return Promise.any([
newLeafWrapper(videoId, ignoreCache) newLeafWrapper(videoId, ignoreCache)
.then(videoData => convertFromNewLeaf(videoData)), .then(videoData => convertFromNewLeaf(videoData)),
getPlayerData(videoId) getPlayerData(videoId, ignoreCache)
.then(data => convertFromInnerTube(data)) .then(data => convertFromInnerTube(data))
]).catch(() => { ]).catch(() => {
return null; return null;

View File

@@ -1,7 +1,9 @@
import axios from "axios"; import axios from "axios";
import { Logger } from "./logger";
import { innerTubeVideoDetails } from "../types/innerTubeApi.model"; import { innerTubeVideoDetails } from "../types/innerTubeApi.model";
import DiskCache from "./diskCache";
export async function getPlayerData(videoID: string): Promise<innerTubeVideoDetails> { async function getFromITube (videoID: string): Promise<innerTubeVideoDetails> {
// start subrequest // start subrequest
const url = "https://www.youtube.com/youtubei/v1/player"; const url = "https://www.youtube.com/youtubei/v1/player";
const data = { const data = {
@@ -22,3 +24,35 @@ export async function getPlayerData(videoID: string): Promise<innerTubeVideoDeta
return Promise.reject(result.status); return Promise.reject(result.status);
} }
} }
export async function getPlayerData (videoID: string, ignoreCache = false): Promise<innerTubeVideoDetails> {
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);
}
}

View File

@@ -23,16 +23,16 @@ const currentViews = 49816;
describe("innertube API test", function() { describe("innertube API test", function() {
it("should be able to get innerTube details", async () => { 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)); assert.ok(partialDeepEquals(result, expectedInnerTube));
}); });
it("Should have more views than current", async () => { 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); assert.ok(Number(result.viewCount) >= currentViews);
}); });
it("Should have equivalent response from NewLeaf", async function () { it("Should have equivalent response from NewLeaf", async function () {
if (!config.newLeafURLs || config.newLeafURLs.length <= 0 || config.newLeafURLs[0] == "placeholder") this.skip(); 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); const newLeafResponse = await YouTubeAPI.listVideos(videoID, true);
// validate videoID // validate videoID
assert.strictEqual(itResponse.videoId, videoID); assert.strictEqual(itResponse.videoId, videoID);