This commit is contained in:
Ajay
2022-12-04 19:54:46 -05:00
8 changed files with 664 additions and 521 deletions

View File

@@ -1,10 +1,10 @@
FROM node:16-alpine as builder
FROM node:18-alpine as builder
RUN apk add --no-cache --virtual .build-deps python3 make g++
COPY package.json package-lock.json tsconfig.json entrypoint.sh ./
COPY src src
RUN npm ci && npm run tsc
FROM node:16-alpine as app
FROM node:18-alpine as app
WORKDIR /usr/src/app
RUN apk add --no-cache git postgresql-client
COPY --from=builder ./node_modules ./node_modules

1083
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -19,42 +19,42 @@
"author": "Ajay Ramachandran",
"license": "MIT",
"dependencies": {
"axios": "^0.27.2",
"better-sqlite3": "^7.6.0",
"cron": "^2.0.0",
"express": "^4.18.1",
"axios": "^1.1.3",
"better-sqlite3": "^7.6.2",
"cron": "^2.1.0",
"express": "^4.18.2",
"express-promise-router": "^4.1.1",
"express-rate-limit": "^6.4.0",
"express-rate-limit": "^6.7.0",
"form-data": "^4.0.0",
"lodash": "^4.17.21",
"pg": "^8.7.3",
"pg": "^8.8.0",
"rate-limit-redis": "^3.0.1",
"redis": "^4.2.0",
"redis": "^4.5.0",
"sync-mysql": "^3.0.1"
},
"devDependencies": {
"@istanbuljs/nyc-config-typescript": "^1.0.2",
"@types/better-sqlite3": "^7.5.0",
"@types/better-sqlite3": "^7.6.2",
"@types/cron": "^2.0.0",
"@types/express": "^4.17.13",
"@types/lodash": "^4.14.182",
"@types/mocha": "^9.1.1",
"@types/node": "^18.0.3",
"@types/express": "^4.17.14",
"@types/lodash": "^4.14.189",
"@types/mocha": "^10.0.0",
"@types/node": "^18.11.9",
"@types/pg": "^8.6.5",
"@types/sinon": "^10.0.13",
"@typescript-eslint/eslint-plugin": "^5.30.6",
"@typescript-eslint/parser": "^5.30.6",
"@typescript-eslint/eslint-plugin": "^5.44.0",
"@typescript-eslint/parser": "^5.44.0",
"axios-mock-adapter": "^1.21.2",
"eslint": "^8.19.0",
"mocha": "^10.0.0",
"nodemon": "^2.0.19",
"eslint": "^8.28.0",
"mocha": "^10.1.0",
"nodemon": "^2.0.20",
"nyc": "^15.1.0",
"sinon": "^14.0.0",
"sinon": "^14.0.2",
"ts-mock-imports": "^1.3.8",
"ts-node": "^10.8.2",
"typescript": "^4.7.4"
"ts-node": "^10.9.1",
"typescript": "^4.9.3"
},
"engines": {
"node": ">=16"
"node": ">=18"
}
}

View File

@@ -1,7 +1,7 @@
export interface innerTubeVideoDetails {
"videoId": string,
"title": string,
"lengthSeconds": string, // yes, don't ask.
"lengthSeconds"?: string, // yes, don't ask.
"channelId": string,
"isOwnerViewing": boolean,
"shortDescription": string,

View File

@@ -3,6 +3,30 @@ import { Logger } from "./logger";
import { innerTubeVideoDetails } from "../types/innerTubeApi.model";
import DiskCache from "./diskCache";
const privateResponse = (videoId: string): innerTubeVideoDetails => ({
videoId,
title: "",
channelId: "",
// exclude video duration
isOwnerViewing: false,
shortDescription: "",
isCrawlable: false,
thumbnail: {
thumbnails: [{
url: "https://s.ytimg.com/yts/img/meh7-vflGevej7.png",
width: 140,
height: 100
}]
},
allowRatings: false,
viewCount: "0", // yes, don't ask
author: "",
isPrivate: true,
isUnpluggedCorpus: true,
isLiveContent: false,
publishDate: ""
});
async function getFromITube (videoID: string): Promise<innerTubeVideoDetails> {
// start subrequest
const url = "https://www.youtube.com/youtubei/v1/player";
@@ -20,9 +44,9 @@ async function getFromITube (videoID: string): Promise<innerTubeVideoDetails> {
});
/* istanbul ignore else */
if (result.status === 200) {
return result.data.videoDetails;
return result.data?.videoDetails ?? privateResponse(videoID);
} else {
return Promise.reject(result.status);
return Promise.reject(`Innertube returned non-200 response: ${result.status}`);
}
}

View File

@@ -46,4 +46,9 @@ describe("innertube API test", function() {
const videoDetail = await getVideoDetails(videoID);
assert.ok(videoDetail);
});
it("Should not fail when getting data for private video", async function () {
const privateVideoId = "ZuibAax0VD8";
const videoDetail = await getVideoDetails(privateVideoId);
assert.ok(videoDetail);
});
});

View File

@@ -1292,4 +1292,20 @@ describe("postSkipSegments", () => {
})
.catch(err => done(err));
});
it("Should successfully submit if video is private", (done) => {
const videoID = "private-video";
postSkipSegmentParam({
videoID,
startTime: 1,
endTime: 5,
category: "sponsor",
userID: submitUserTwo
})
.then(res => {
assert.strictEqual(res.status, 200);
done();
})
.catch(err => done(err));
});
});

View File

@@ -63,6 +63,11 @@ export class YouTubeApiMock {
lengthSeconds: 100,
} as APIVideoData
};
} else if (obj.id === "private-video") {
return {
err: false,
data: {} as APIVideoData
};
} else {
return {
err: false,