Skip to content

Commit 55aa33a

Browse files
committed
add DiskCache to getPlayerData
1 parent 07926ad commit 55aa33a

File tree

3 files changed

+40
-6
lines changed

3 files changed

+40
-6
lines changed

src/utils/getVideoDetails.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,13 @@ async function newLeafWrapper(videoId: string, ignoreCache: boolean) {
4545

4646
export function getVideoDetails(videoId: string, ignoreCache = false): Promise<videoDetails> {
4747
if (!config.newLeafURLs) {
48-
return getPlayerData(videoId)
48+
return getPlayerData(videoId, ignoreCache)
4949
.then(data => convertFromInnerTube(data));
5050
}
5151
return Promise.any([
5252
newLeafWrapper(videoId, ignoreCache)
5353
.then(videoData => convertFromNewLeaf(videoData)),
54-
getPlayerData(videoId)
54+
getPlayerData(videoId, ignoreCache)
5555
.then(data => convertFromInnerTube(data))
5656
]).catch(() => {
5757
return null;

src/utils/innerTubeAPI.ts

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import axios from "axios";
2+
import { Logger } from "./logger";
23
import { innerTubeVideoDetails } from "../types/innerTubeApi.model";
4+
import DiskCache from "./diskCache";
35

4-
export async function getPlayerData(videoID: string): Promise<innerTubeVideoDetails> {
6+
async function getFromITube (videoID: string): Promise<innerTubeVideoDetails> {
57
// start subrequest
68
const url = "https://www.youtube.com/youtubei/v1/player";
79
const data = {
@@ -21,4 +23,36 @@ export async function getPlayerData(videoID: string): Promise<innerTubeVideoDeta
2123
} else {
2224
return Promise.reject(result.status);
2325
}
26+
}
27+
28+
export async function getPlayerData (videoID: string, ignoreCache = false): Promise<innerTubeVideoDetails> {
29+
if (!videoID || videoID.length !== 11 || videoID.includes(".")) {
30+
return Promise.reject("Invalid video ID");
31+
}
32+
33+
const cacheKey = `yt.itube.video.${videoID}`;
34+
if (!ignoreCache) { // try fetching from cache
35+
try {
36+
const data = await DiskCache.get(cacheKey);
37+
if (data) {
38+
Logger.debug(`InnerTube API: cache used for video information: ${videoID}`);
39+
return data as innerTubeVideoDetails;
40+
}
41+
} catch (err) {
42+
return Promise.reject(err);
43+
}
44+
}
45+
try {
46+
const data = await getFromITube(videoID)
47+
.catch(err => {
48+
Logger.warn(`InnerTube API Error for ${videoID}: ${err}`);
49+
return Promise.reject(err);
50+
});
51+
DiskCache.set(cacheKey, data)
52+
.then(() => Logger.debug(`InnerTube API: video information cache set for: ${videoID}`))
53+
.catch((err: any) => Logger.warn(err));
54+
return data;
55+
} catch (err) {
56+
return Promise.reject(err);
57+
}
2458
}

test/cases/innerTubeApi.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,16 @@ const currentViews = 49816;
2323

2424
describe("innertube API test", function() {
2525
it("should be able to get innerTube details", async () => {
26-
const result = await innerTube.getPlayerData(videoID);
26+
const result = await innerTube.getPlayerData(videoID, true);
2727
assert.ok(partialDeepEquals(result, expectedInnerTube));
2828
});
2929
it("Should have more views than current", async () => {
30-
const result = await innerTube.getPlayerData(videoID);
30+
const result = await innerTube.getPlayerData(videoID, true);
3131
assert.ok(Number(result.viewCount) >= currentViews);
3232
});
3333
it("Should have equivalent response from NewLeaf", async function () {
3434
if (!config.newLeafURLs || config.newLeafURLs.length <= 0 || config.newLeafURLs[0] == "placeholder") this.skip();
35-
const itResponse = await innerTube.getPlayerData(videoID);
35+
const itResponse = await innerTube.getPlayerData(videoID, true);
3636
const newLeafResponse = await YouTubeAPI.listVideos(videoID, true);
3737
// validate videoID
3838
assert.strictEqual(itResponse.videoId, videoID);

0 commit comments

Comments
 (0)