add DiskCache to getPlayerData

This commit is contained in:
Michael C 2022-09-26 15:58:33 -04:00
parent 07926ada57
commit 55aa33aa6e
No known key found for this signature in database
GPG key ID: FFB04FB3B878B7B4
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> {
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;

View file

@ -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<innerTubeVideoDetails> {
async function getFromITube (videoID: string): Promise<innerTubeVideoDetails> {
// start subrequest
const url = "https://www.youtube.com/youtubei/v1/player";
const data = {
@ -21,4 +23,36 @@ export async function getPlayerData(videoID: string): Promise<innerTubeVideoDeta
} else {
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() {
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);