Merge pull request #503 from mchangrh/innerTubeDuration

add innerTube API, types and tests
This commit is contained in:
Ajay Ramachandran
2022-09-29 16:45:55 -04:00
committed by GitHub
15 changed files with 251 additions and 94 deletions

View File

@@ -19,9 +19,9 @@ if (db instanceof Postgres) {
await db.prepare("run", query, [chapterNamesVid1, 70, 75, 2, 0, "chapterNamesVid-2", "testman", 0, 50, "chapter", "chapter", "YouTube", 0, 0, 0, "A different one"]);
await db.prepare("run", query, [chapterNamesVid1, 71, 76, 2, 0, "chapterNamesVid-3", "testman", 0, 50, "chapter", "chapter", "YouTube", 0, 0, 0, "Something else"]);
await db.prepare("run", `INSERT INTO "videoInfo" ("videoID", "channelID", "title", "published", "genreUrl")
SELECT ?, ?, ?, ?, ?`, [
chapterNamesVid1, chapterChannelID, "", 0, ""
await db.prepare("run", `INSERT INTO "videoInfo" ("videoID", "channelID", "title", "published")
SELECT ?, ?, ?, ?`, [
chapterNamesVid1, chapterChannelID, "", 0
]);
});

View File

@@ -0,0 +1,49 @@
import { config } from "../../src/config";
import assert from "assert";
import { YouTubeAPI } from "../../src/utils/youtubeApi";
import * as innerTube from "../../src/utils/innerTubeAPI";
import { partialDeepEquals } from "../utils/partialDeepEquals";
import { getVideoDetails } from "../../src/utils/getVideoDetails";
const videoID = "BaW_jenozKc";
const expectedInnerTube = { // partial type of innerTubeVideoDetails
videoId: videoID,
title: "youtube-dl test video \"'/\\ä↭𝕐",
lengthSeconds: "10",
channelId: "UCLqxVugv74EIW3VWh2NOa3Q",
isOwnerViewing: false,
isCrawlable: true,
allowRatings: true,
author: "Philipp Hagemeister",
isPrivate: false,
isUnpluggedCorpus: false,
isLiveContent: false
};
const currentViews = 49816;
describe("innertube API test", function() {
it("should be able to get innerTube details", async () => {
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, 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, true);
const newLeafResponse = await YouTubeAPI.listVideos(videoID, true);
// validate videoID
assert.strictEqual(itResponse.videoId, videoID);
assert.strictEqual(newLeafResponse.data?.videoId, videoID);
// validate description
assert.strictEqual(itResponse.shortDescription, newLeafResponse.data?.description);
// validate authorId
assert.strictEqual(itResponse.channelId, newLeafResponse.data?.authorId);
});
it("Should return data from generic endpoint", async function () {
const videoDetail = await getVideoDetails(videoID);
assert.ok(videoDetail);
});
});

View File

@@ -141,7 +141,6 @@ describe("postSkipSegments", () => {
title: "Example Title",
channelID: "ExampleChannel",
published: 123,
genreUrl: ""
};
assert.ok(partialDeepEquals(videoInfo, expectedVideoInfo));

View File

@@ -15,7 +15,7 @@ export class YouTubeApiMock {
if (obj.id === "noDuration" || obj.id === "full_video_duration_segment") {
return {
err: null,
err: false,
data: {
title: "Example Title",
lengthSeconds: 0,
@@ -32,7 +32,7 @@ export class YouTubeApiMock {
};
} else if (obj.id === "duration-update") {
return {
err: null,
err: false,
data: {
title: "Example Title",
lengthSeconds: 500,
@@ -49,7 +49,7 @@ export class YouTubeApiMock {
};
} else if (obj.id === "channelid-convert") {
return {
err: null,
err: false,
data: {
title: "Video Lookup Title",
author: "ChannelAuthor",
@@ -58,14 +58,14 @@ export class YouTubeApiMock {
};
} else if (obj.id === "duration-changed") {
return {
err: null,
err: false,
data: {
lengthSeconds: 100,
} as APIVideoData
};
} else {
return {
err: null,
err: false,
data: {
title: "Example Title",
authorId: "ExampleChannel",