mirror of
https://github.com/ajayyy/SponsorBlockServer.git
synced 2025-12-07 20:17:02 +03:00
add DiskCache to getPlayerData
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user