fix: fixing proxy changes

pull/3757/head
Ryan 5 months ago
parent b9e17357b9
commit 0d64e5e79e

@ -38,6 +38,7 @@
"@supercharge/request-ip": "1.2.0",
"@svgr/webpack": "6.5.1",
"@tanem/react-nprogress": "5.0.30",
"@types/needle": "^3.3.0",
"ace-builds": "1.15.2",
"axios": "1.6.4",
"axios-rate-limit": "1.3.0",
@ -60,6 +61,7 @@
"gravatar-url": "3.1.0",
"intl": "1.2.5",
"lodash": "4.17.21",
"needle": "^3.3.1",
"next": "12.3.4",
"node-cache": "5.1.2",
"node-gyp": "9.3.1",

@ -1,4 +1,3 @@
import logger from '@server/logger';
import type {
AxiosInstance,
AxiosProxyConfig,
@ -7,6 +6,8 @@ import type {
} from 'axios';
import axios from 'axios';
import rateLimit from 'axios-rate-limit';
import type { NeedleOptions } from 'needle';
import needle from 'needle';
import type NodeCache from 'node-cache';
// 5 minute default TTL (in seconds)
@ -29,20 +30,28 @@ class ExternalAPI {
protected proxy: AxiosProxyConfig;
private baseUrl: string;
private cache?: NodeCache;
protected config?: CreateAxiosDefaults;
private headers: { [key: string]: string };
private params: Record<string, unknown>;
constructor(
baseUrl: string,
params: Record<string, unknown>,
options: ExternalAPIOptions = {}
) {
const config: CreateAxiosDefaults = {
this.headers = {
'Content-Type': 'application/json',
Accept: 'application/json',
// "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36",
...options.headers,
};
this.params = params;
this.config = {
baseURL: baseUrl,
params,
headers: {
'Content-Type': 'application/json',
Accept: 'application/json',
...options.headers,
},
params: this.params,
headers: this.headers,
};
if (process.env.HTTPS_PROXY) {
@ -57,11 +66,10 @@ class ExternalAPI {
},
protocol: port == 443 ? 'https' : 'http',
};
logger.debug('Using auth pass:%s', this.proxy.auth?.password);
config.proxy = this.proxy;
this.config.proxy = this.proxy;
}
this.axios = axios.create(config);
this.axios = axios.create(this.config);
if (options.rateLimit) {
this.axios = rateLimit(this.axios, {
@ -85,13 +93,36 @@ class ExternalAPI {
return cachedItem;
}
const response = await this.axios.get<T>(endpoint, config);
const params = {
...config?.params,
...this.params,
};
if (this.cache) {
this.cache.set(cacheKey, response.data, ttl ?? DEFAULT_TTL);
const args = '?' + new URLSearchParams(params).toString();
const path = new URL(endpoint + args, this.baseUrl);
const request: NeedleOptions = {
json: true,
headers: this.headers,
};
if (process.env.HTTPS_PROXY) {
request.proxy = process.env.HTTPS_PROXY;
}
return response.data;
return new Promise<T>((resolve, reject) => {
needle.get(path.toString(), request, (err, _, body) => {
if (err) {
reject(err);
} else {
resolve(body);
}
});
}).then((data) => {
if (this.cache) {
this.cache.set(cacheKey, data, ttl ?? DEFAULT_TTL);
}
return data;
});
}
protected async post<T>(

@ -155,7 +155,7 @@ export interface IMDBRating {
*/
class IMDBRadarrProxy extends ExternalAPI {
constructor() {
super('https://api.radarr.video/v1', {
super('https://api.radarr.video', {
headers: {
'Content-Type': 'application/json',
Accept: 'application/json',
@ -172,7 +172,7 @@ class IMDBRadarrProxy extends ExternalAPI {
public async getMovieRatings(IMDBid: string): Promise<IMDBRating | null> {
try {
const data = await this.get<IMDBRadarrProxyResponse>(
`/movie/imdb/${IMDBid}`
`/v1/movie/imdb/${IMDBid}`
);
if (!data?.length || data[0].ImdbId !== IMDBid) {

@ -106,7 +106,7 @@ class TheMovieDb extends ExternalAPI {
originalLanguage,
}: { region?: string; originalLanguage?: string } = {}) {
super(
'https://api.themoviedb.org/3',
'https://api.themoviedb.org',
{
api_key: 'db55323b8d3e4154498498a75642b381',
},
@ -129,7 +129,7 @@ class TheMovieDb extends ExternalAPI {
language = 'en',
}: SearchOptions): Promise<TmdbSearchMultiResponse> => {
try {
const data = await this.get<TmdbSearchMultiResponse>('/search/multi', {
const data = await this.get<TmdbSearchMultiResponse>('/3/search/multi', {
params: { query, page, include_adult: includeAdult, language },
});
@ -152,7 +152,7 @@ class TheMovieDb extends ExternalAPI {
year,
}: SingleSearchOptions): Promise<TmdbSearchMovieResponse> => {
try {
const data = await this.get<TmdbSearchMovieResponse>('/search/movie', {
const data = await this.get<TmdbSearchMovieResponse>('/3/search/movie', {
params: {
query,
page,
@ -181,7 +181,7 @@ class TheMovieDb extends ExternalAPI {
year,
}: SingleSearchOptions): Promise<TmdbSearchTvResponse> => {
try {
const data = await this.get<TmdbSearchTvResponse>('/search/tv', {
const data = await this.get<TmdbSearchTvResponse>('/3/search/tv', {
params: {
query,
page,
@ -210,7 +210,7 @@ class TheMovieDb extends ExternalAPI {
language?: string;
}): Promise<TmdbPersonDetails> => {
try {
const data = await this.get<TmdbPersonDetails>(`/person/${personId}`, {
const data = await this.get<TmdbPersonDetails>(`/3/person/${personId}`, {
params: { language },
});
@ -229,7 +229,7 @@ class TheMovieDb extends ExternalAPI {
}): Promise<TmdbPersonCombinedCredits> => {
try {
const data = await this.get<TmdbPersonCombinedCredits>(
`/person/${personId}/combined_credits`,
`/3/person/${personId}/combined_credits`,
{
params: { language },
}
@ -252,7 +252,7 @@ class TheMovieDb extends ExternalAPI {
}): Promise<TmdbMovieDetails> => {
try {
const data = await this.get<TmdbMovieDetails>(
`/movie/${movieId}`,
`/3/movie/${movieId}`,
{
params: {
language,
@ -279,7 +279,7 @@ class TheMovieDb extends ExternalAPI {
}): Promise<TmdbTvDetails> => {
try {
const data = await this.get<TmdbTvDetails>(
`/tv/${tvId}`,
`/3/tv/${tvId}`,
{
params: {
language,
@ -307,7 +307,7 @@ class TheMovieDb extends ExternalAPI {
}): Promise<TmdbSeasonWithEpisodes> => {
try {
const data = await this.get<TmdbSeasonWithEpisodes>(
`/tv/${tvId}/season/${seasonNumber}`,
`/3/tv/${tvId}/season/${seasonNumber}`,
{
params: {
language,
@ -333,7 +333,7 @@ class TheMovieDb extends ExternalAPI {
}): Promise<TmdbSearchMovieResponse> {
try {
const data = await this.get<TmdbSearchMovieResponse>(
`/movie/${movieId}/recommendations`,
`/3/movie/${movieId}/recommendations`,
{
params: {
page,
@ -359,7 +359,7 @@ class TheMovieDb extends ExternalAPI {
}): Promise<TmdbSearchMovieResponse> {
try {
const data = await this.get<TmdbSearchMovieResponse>(
`/movie/${movieId}/similar`,
`/3/movie/${movieId}/similar`,
{
params: {
page,
@ -385,7 +385,7 @@ class TheMovieDb extends ExternalAPI {
}): Promise<TmdbSearchMovieResponse> {
try {
const data = await this.get<TmdbSearchMovieResponse>(
`/keyword/${keywordId}/movies`,
`/3/keyword/${keywordId}/movies`,
{
params: {
page,
@ -411,7 +411,7 @@ class TheMovieDb extends ExternalAPI {
}): Promise<TmdbSearchTvResponse> {
try {
const data = await this.get<TmdbSearchTvResponse>(
`/tv/${tvId}/recommendations`,
`/3/tv/${tvId}/recommendations`,
{
params: {
page,
@ -438,12 +438,15 @@ class TheMovieDb extends ExternalAPI {
language?: string;
}): Promise<TmdbSearchTvResponse> {
try {
const data = await this.get<TmdbSearchTvResponse>(`/tv/${tvId}/similar`, {
params: {
page,
language,
},
});
const data = await this.get<TmdbSearchTvResponse>(
`/3/tv/${tvId}/similar`,
{
params: {
page,
language,
},
}
);
return data;
} catch (e) {
@ -482,42 +485,45 @@ class TheMovieDb extends ExternalAPI {
.toISOString()
.split('T')[0];
const data = await this.get<TmdbSearchMovieResponse>('/discover/movie', {
params: {
sort_by: sortBy,
page,
include_adult: includeAdult,
language,
region: this.region,
with_original_language:
originalLanguage && originalLanguage !== 'all'
? originalLanguage
: originalLanguage === 'all'
? undefined
: this.originalLanguage,
// Set our release date values, but check if one is set and not the other,
// so we can force a past date or a future date. TMDB Requires both values if one is set!
'primary_release_date.gte':
!primaryReleaseDateGte && primaryReleaseDateLte
? defaultPastDate
: primaryReleaseDateGte,
'primary_release_date.lte':
!primaryReleaseDateLte && primaryReleaseDateGte
? defaultFutureDate
: primaryReleaseDateLte,
with_genres: genre,
with_companies: studio,
with_keywords: keywords,
'with_runtime.gte': withRuntimeGte,
'with_runtime.lte': withRuntimeLte,
'vote_average.gte': voteAverageGte,
'vote_average.lte': voteAverageLte,
'vote_count.gte': voteCountGte,
'vote_count.lte': voteCountLte,
watch_region: watchRegion,
with_watch_providers: watchProviders,
},
});
const data = await this.get<TmdbSearchMovieResponse>(
'/3/discover/movie',
{
params: {
sort_by: sortBy,
page,
include_adult: includeAdult,
language,
region: this.region,
with_original_language:
originalLanguage && originalLanguage !== 'all'
? originalLanguage
: originalLanguage === 'all'
? undefined
: this.originalLanguage,
// Set our release date values, but check if one is set and not the other,
// so we can force a past date or a future date. TMDB Requires both values if one is set!
'primary_release_date.gte':
!primaryReleaseDateGte && primaryReleaseDateLte
? defaultPastDate
: primaryReleaseDateGte,
'primary_release_date.lte':
!primaryReleaseDateLte && primaryReleaseDateGte
? defaultFutureDate
: primaryReleaseDateLte,
with_genres: genre,
with_companies: studio,
with_keywords: keywords,
'with_runtime.gte': withRuntimeGte,
'with_runtime.lte': withRuntimeLte,
'vote_average.gte': voteAverageGte,
'vote_average.lte': voteAverageLte,
'vote_count.gte': voteCountGte,
'vote_count.lte': voteCountLte,
watch_region: watchRegion,
with_watch_providers: watchProviders,
},
}
);
return data;
} catch (e) {
@ -556,7 +562,7 @@ class TheMovieDb extends ExternalAPI {
.toISOString()
.split('T')[0];
const data = await this.get<TmdbSearchTvResponse>('/discover/tv', {
const data = await this.get<TmdbSearchTvResponse>('/3/discover/tv', {
params: {
sort_by: sortBy,
page,
@ -608,7 +614,7 @@ class TheMovieDb extends ExternalAPI {
}): Promise<TmdbUpcomingMoviesResponse> => {
try {
const data = await this.get<TmdbUpcomingMoviesResponse>(
'/movie/upcoming',
'/3/movie/upcoming',
{
params: {
page,
@ -636,7 +642,7 @@ class TheMovieDb extends ExternalAPI {
} = {}): Promise<TmdbSearchMultiResponse> => {
try {
const data = await this.get<TmdbSearchMultiResponse>(
`/trending/all/${timeWindow}`,
`/3/trending/all/${timeWindow}`,
{
params: {
page,
@ -661,7 +667,7 @@ class TheMovieDb extends ExternalAPI {
} = {}): Promise<TmdbSearchMovieResponse> => {
try {
const data = await this.get<TmdbSearchMovieResponse>(
`/trending/movie/${timeWindow}`,
`/3/trending/movie/${timeWindow}`,
{
params: {
page,
@ -684,7 +690,7 @@ class TheMovieDb extends ExternalAPI {
} = {}): Promise<TmdbSearchTvResponse> => {
try {
const data = await this.get<TmdbSearchTvResponse>(
`/trending/tv/${timeWindow}`,
`/3/trending/tv/${timeWindow}`,
{
params: {
page,
@ -715,7 +721,7 @@ class TheMovieDb extends ExternalAPI {
}): Promise<TmdbExternalIdResponse> {
try {
const data = await this.get<TmdbExternalIdResponse>(
`/find/${externalId}`,
`/3/find/${externalId}`,
{
params: {
external_source: type === 'imdb' ? 'imdb_id' : 'tvdb_id',
@ -808,7 +814,7 @@ class TheMovieDb extends ExternalAPI {
}): Promise<TmdbCollection> {
try {
const data = await this.get<TmdbCollection>(
`/collection/${collectionId}`,
`/3/collection/${collectionId}`,
{
params: {
language,
@ -825,7 +831,7 @@ class TheMovieDb extends ExternalAPI {
public async getRegions(): Promise<TmdbRegion[]> {
try {
const data = await this.get<TmdbRegion[]>(
'/configuration/countries',
'/3/configuration/countries',
{},
86400 // 24 hours
);
@ -841,7 +847,7 @@ class TheMovieDb extends ExternalAPI {
public async getLanguages(): Promise<TmdbLanguage[]> {
try {
const data = await this.get<TmdbLanguage[]>(
'/configuration/languages',
'/3/configuration/languages',
{},
86400 // 24 hours
);
@ -857,7 +863,7 @@ class TheMovieDb extends ExternalAPI {
public async getStudio(studioId: number): Promise<TmdbProductionCompany> {
try {
const data = await this.get<TmdbProductionCompany>(
`/company/${studioId}`
`/3/company/${studioId}`
);
return data;
@ -868,7 +874,7 @@ class TheMovieDb extends ExternalAPI {
public async getNetwork(networkId: number): Promise<TmdbNetwork> {
try {
const data = await this.get<TmdbNetwork>(`/network/${networkId}`);
const data = await this.get<TmdbNetwork>(`/3/network/${networkId}`);
return data;
} catch (e) {
@ -883,7 +889,7 @@ class TheMovieDb extends ExternalAPI {
} = {}): Promise<TmdbGenre[]> {
try {
const data = await this.get<TmdbGenresResult>(
'/genre/movie/list',
'/3/genre/movie/list',
{
params: {
language,
@ -897,7 +903,7 @@ class TheMovieDb extends ExternalAPI {
data.genres.some((genre) => !genre.name)
) {
const englishData = await this.get<TmdbGenresResult>(
'/genre/movie/list',
'/3/genre/movie/list',
{
params: {
language: 'en',
@ -934,7 +940,7 @@ class TheMovieDb extends ExternalAPI {
} = {}): Promise<TmdbGenre[]> {
try {
const data = await this.get<TmdbGenresResult>(
'/genre/tv/list',
'/3/genre/tv/list',
{
params: {
language,
@ -948,7 +954,7 @@ class TheMovieDb extends ExternalAPI {
data.genres.some((genre) => !genre.name)
) {
const englishData = await this.get<TmdbGenresResult>(
'/genre/tv/list',
'/3/genre/tv/list',
{
params: {
language: 'en',
@ -985,7 +991,7 @@ class TheMovieDb extends ExternalAPI {
}): Promise<TmdbKeyword> {
try {
const data = await this.get<TmdbKeyword>(
`/keyword/${keywordId}`,
`/3/keyword/${keywordId}`,
undefined,
604800 // 7 days
);
@ -1005,7 +1011,7 @@ class TheMovieDb extends ExternalAPI {
}): Promise<TmdbKeywordSearchResponse> {
try {
const data = await this.get<TmdbKeywordSearchResponse>(
'/search/keyword',
'/3/search/keyword',
{
params: {
query,
@ -1030,7 +1036,7 @@ class TheMovieDb extends ExternalAPI {
}): Promise<TmdbCompanySearchResponse> {
try {
const data = await this.get<TmdbCompanySearchResponse>(
'/search/company',
'/3/search/company',
{
params: {
query,
@ -1053,7 +1059,7 @@ class TheMovieDb extends ExternalAPI {
}) {
try {
const data = await this.get<{ results: TmdbWatchProviderRegion[] }>(
'/watch/providers/regions',
'/3/watch/providers/regions',
{
params: {
language: language ?? this.originalLanguage,
@ -1079,7 +1085,7 @@ class TheMovieDb extends ExternalAPI {
}) {
try {
const data = await this.get<{ results: TmdbWatchProviderDetails[] }>(
'/watch/providers/movie',
'/3/watch/providers/movie',
{
params: {
language: language ?? this.originalLanguage,
@ -1106,7 +1112,7 @@ class TheMovieDb extends ExternalAPI {
}) {
try {
const data = await this.get<{ results: TmdbWatchProviderDetails[] }>(
'/watch/providers/tv',
'/3/watch/providers/tv',
{
params: {
language: language ?? this.originalLanguage,

@ -3684,16 +3684,9 @@
"@svgr/plugin-jsx" "^6.5.1"
"@svgr/plugin-svgo" "^6.5.1"
"@swc/helpers@0.4.11":
version "0.4.11"
resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.11.tgz#db23a376761b3d31c26502122f349a21b592c8de"
integrity sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==
dependencies:
tslib "^2.4.0"
"@swc/helpers@^0.4.14":
"@swc/helpers@0.4.11", "@swc/helpers@0.4.36", "@swc/helpers@^0.4.14":
version "0.4.36"
resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.36.tgz"
resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.36.tgz#fcfff76ed52c214f357e8e9d3f37b568908072d9"
integrity sha512-5lxnyLEYFskErRPenYItLRSge5DjrJngYKdVjRSrWfza9G6KkgHEXi0vUZiyUeMU5JfXH1YnvXZzSp8ul88o2Q==
dependencies:
legacy-swc-helpers "npm:@swc/helpers@=0.4.14"
@ -4005,6 +3998,13 @@
dependencies:
"@types/express" "*"
"@types/needle@^3.3.0":
version "3.3.0"
resolved "https://registry.yarnpkg.com/@types/needle/-/needle-3.3.0.tgz#4efe9c27b4ffed8b5b9f2025dab75931877daac0"
integrity sha512-UFIuc1gdyzAqeVUYpSL+cliw2MmU/ZUhVZKE7Zo4wPbgc8hbljeKSnn6ls6iG8r5jpegPXLUIhJ+Wb2kLVs8cg==
dependencies:
"@types/node" "*"
"@types/node-schedule@2.1.0":
version "2.1.0"
resolved "https://registry.npmjs.org/@types/node-schedule/-/node-schedule-2.1.0.tgz"
@ -8274,7 +8274,7 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24:
dependencies:
safer-buffer ">= 2.1.2 < 3"
iconv-lite@0.6.3, iconv-lite@^0.6.2:
iconv-lite@0.6.3, iconv-lite@^0.6.2, iconv-lite@^0.6.3:
version "0.6.3"
resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz"
integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
@ -10420,6 +10420,14 @@ nearley@^2.20.1:
railroad-diagrams "^1.0.0"
randexp "0.4.6"
needle@^3.3.1:
version "3.3.1"
resolved "https://registry.yarnpkg.com/needle/-/needle-3.3.1.tgz#63f75aec580c2e77e209f3f324e2cdf3d29bd049"
integrity sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==
dependencies:
iconv-lite "^0.6.3"
sax "^1.2.4"
negotiator@0.6.3, negotiator@^0.6.2, negotiator@^0.6.3:
version "0.6.3"
resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz"
@ -12559,7 +12567,7 @@ safe-stable-stringify@^2.3.1:
resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
sax@>=0.6.0:
sax@>=0.6.0, sax@^1.2.4:
version "1.3.0"
resolved "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz"
integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==

Loading…
Cancel
Save