mirror of
https://github.com/movie-web/providers.git
synced 2025-09-13 17:53:24 +00:00
eslint fixes
This commit is contained in:
261
src/dev-cli.ts
261
src/dev-cli.ts
@@ -47,8 +47,6 @@ if (!TMDB_API_KEY?.trim()) {
|
|||||||
throw new Error('Missing MOVIE_WEB_TMDB_API_KEY environment variable');
|
throw new Error('Missing MOVIE_WEB_TMDB_API_KEY environment variable');
|
||||||
}
|
}
|
||||||
|
|
||||||
const sources = getAllSources();
|
|
||||||
|
|
||||||
function getAllSources() {
|
function getAllSources() {
|
||||||
// * The only way to get a list of all sources is to
|
// * The only way to get a list of all sources is to
|
||||||
// * create all these things. Maybe this should change
|
// * create all these things. Maybe this should change
|
||||||
@@ -57,10 +55,7 @@ function getAllSources() {
|
|||||||
target: targets.NATIVE,
|
target: targets.NATIVE,
|
||||||
});
|
});
|
||||||
|
|
||||||
const sources = providers.listSources();
|
const combined = [...providers.listSources(), ...providers.listEmbeds()];
|
||||||
const embeds = providers.listEmbeds();
|
|
||||||
|
|
||||||
const combined = [...sources, ...embeds];
|
|
||||||
|
|
||||||
// * Remove dupes
|
// * Remove dupes
|
||||||
const map = new Map(combined.map((source) => [source.id, source]));
|
const map = new Map(combined.map((source) => [source.id, source]));
|
||||||
@@ -68,6 +63,9 @@ function getAllSources() {
|
|||||||
return [...map.values()];
|
return [...map.values()];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// * Defined here cuz ESLint didn't like the order these were defined in
|
||||||
|
const sources = getAllSources();
|
||||||
|
|
||||||
async function makeTMDBRequest(url: string): Promise<Response> {
|
async function makeTMDBRequest(url: string): Promise<Response> {
|
||||||
const headers: {
|
const headers: {
|
||||||
accept: 'application/json';
|
accept: 'application/json';
|
||||||
@@ -76,16 +74,20 @@ async function makeTMDBRequest(url: string): Promise<Response> {
|
|||||||
accept: 'application/json',
|
accept: 'application/json',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// * Used to get around ESLint
|
||||||
|
// * Assignment to function parameter 'url'. eslint (no-param-reassign)
|
||||||
|
let requestURL = url;
|
||||||
|
|
||||||
// * JWT keys always start with ey and are ONLY valid as a header.
|
// * JWT keys always start with ey and are ONLY valid as a header.
|
||||||
// * All other keys are ONLY valid as a query param.
|
// * All other keys are ONLY valid as a query param.
|
||||||
// * Thanks TMDB.
|
// * Thanks TMDB.
|
||||||
if (TMDB_API_KEY!.startsWith('ey')) {
|
if (TMDB_API_KEY!.startsWith('ey')) {
|
||||||
headers.authorization = `Bearer ${TMDB_API_KEY}`;
|
headers.authorization = `Bearer ${TMDB_API_KEY}`;
|
||||||
} else {
|
} else {
|
||||||
url += `?api_key=${TMDB_API_KEY}`;
|
requestURL += `?api_key=${TMDB_API_KEY}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
return fetch(url, {
|
return fetch(requestURL, {
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
headers,
|
headers,
|
||||||
});
|
});
|
||||||
@@ -161,8 +163,7 @@ function joinMediaTypes(mediaTypes: string[] | undefined) {
|
|||||||
if (mediaTypes) {
|
if (mediaTypes) {
|
||||||
const formatted = mediaTypes
|
const formatted = mediaTypes
|
||||||
.map((type: string) => {
|
.map((type: string) => {
|
||||||
type = type[0].toUpperCase() + type.substring(1).toLowerCase();
|
return `${type[0].toUpperCase() + type.substring(1).toLowerCase()}s`;
|
||||||
return `${type}s`;
|
|
||||||
})
|
})
|
||||||
.join(' / ');
|
.join(' / ');
|
||||||
|
|
||||||
@@ -171,6 +172,125 @@ function joinMediaTypes(mediaTypes: string[] | undefined) {
|
|||||||
return ''; // * Embed sources pass through here too
|
return ''; // * Embed sources pass through here too
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function runScraper(providers: ProviderControls, source: MetaOutput, options: CommandLineArguments) {
|
||||||
|
const spinnies = new Spinnies();
|
||||||
|
|
||||||
|
if (source.type === 'embed') {
|
||||||
|
spinnies.add('scrape', { text: `Running ${source.name} scraper on ${options.url}` });
|
||||||
|
try {
|
||||||
|
const result = await providers.runEmbedScraper({
|
||||||
|
url: options.url,
|
||||||
|
id: source.id,
|
||||||
|
});
|
||||||
|
spinnies.succeed('scrape', { text: 'Done!' });
|
||||||
|
console.log(result);
|
||||||
|
} catch (error) {
|
||||||
|
let message = 'Unknown error';
|
||||||
|
if (error instanceof Error) {
|
||||||
|
message = error.message;
|
||||||
|
}
|
||||||
|
|
||||||
|
spinnies.fail('scrape', { text: `ERROR: ${message}` });
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let media;
|
||||||
|
|
||||||
|
if (options.type === 'movie') {
|
||||||
|
media = await getMovieMediaDetails(options.tmdbId);
|
||||||
|
} else {
|
||||||
|
media = await getShowMediaDetails(options.tmdbId, options.season, options.episode);
|
||||||
|
}
|
||||||
|
|
||||||
|
spinnies.add('scrape', { text: `Running ${source.name} scraper on ${media.title}` });
|
||||||
|
try {
|
||||||
|
const result = await providers.runSourceScraper({
|
||||||
|
media,
|
||||||
|
id: source.id,
|
||||||
|
});
|
||||||
|
spinnies.succeed('scrape', { text: 'Done!' });
|
||||||
|
console.log(result);
|
||||||
|
} catch (error) {
|
||||||
|
let message = 'Unknown error';
|
||||||
|
if (error instanceof Error) {
|
||||||
|
message = error.message;
|
||||||
|
}
|
||||||
|
|
||||||
|
spinnies.fail('scrape', { text: `ERROR: ${message}` });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function processOptions(options: CommandLineArguments) {
|
||||||
|
if (options.fetcher !== 'node-fetch' && options.fetcher !== 'native') {
|
||||||
|
throw new Error("Fetcher must be either 'native' or 'node-fetch'");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!options.sourceId.trim()) {
|
||||||
|
throw new Error('Source ID must be provided');
|
||||||
|
}
|
||||||
|
|
||||||
|
const source = sources.find(({ id }) => id === options.sourceId);
|
||||||
|
|
||||||
|
if (!source) {
|
||||||
|
throw new Error('Invalid source ID. No source found');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (source.type === 'embed' && !options.url.trim()) {
|
||||||
|
throw new Error('Must provide an embed URL for embed sources');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (source.type === 'source') {
|
||||||
|
if (!options.tmdbId.trim()) {
|
||||||
|
throw new Error('Must provide a TMDB ID for provider sources');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Number.isNaN(Number(options.tmdbId)) || Number(options.tmdbId) < 0) {
|
||||||
|
throw new Error('TMDB ID must be a number greater than 0');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!options.type.trim()) {
|
||||||
|
throw new Error('Must provide a type for provider sources');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.type !== 'movie' && options.type !== 'show') {
|
||||||
|
throw new Error("Invalid media type. Must be either 'movie' or 'show'");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.type === 'show') {
|
||||||
|
if (!options.season.trim()) {
|
||||||
|
throw new Error('Must provide a season number for TV shows');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!options.episode.trim()) {
|
||||||
|
throw new Error('Must provide an episode number for TV shows');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Number.isNaN(Number(options.season)) || Number(options.season) <= 0) {
|
||||||
|
throw new Error('Season number must be a number greater than 0');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Number.isNaN(Number(options.episode)) || Number(options.episode) <= 0) {
|
||||||
|
throw new Error('Episode number must be a number greater than 0');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let fetcher;
|
||||||
|
|
||||||
|
if (options.fetcher === 'native') {
|
||||||
|
fetcher = makeStandardFetcher(fetch as any);
|
||||||
|
} else {
|
||||||
|
fetcher = makeStandardFetcher(nodeFetch);
|
||||||
|
}
|
||||||
|
|
||||||
|
const providers = makeProviders({
|
||||||
|
fetcher,
|
||||||
|
target: targets.NATIVE,
|
||||||
|
});
|
||||||
|
|
||||||
|
await runScraper(providers, source, options);
|
||||||
|
}
|
||||||
|
|
||||||
async function runQuestions() {
|
async function runQuestions() {
|
||||||
const options = {
|
const options = {
|
||||||
fetcher: 'node-fetch',
|
fetcher: 'node-fetch',
|
||||||
@@ -212,7 +332,7 @@ async function runQuestions() {
|
|||||||
options.fetcher = answers.fetcher;
|
options.fetcher = answers.fetcher;
|
||||||
options.sourceId = answers.source;
|
options.sourceId = answers.source;
|
||||||
|
|
||||||
const source = sources.find((source) => source.id === answers.source)!;
|
const source = sources.find(({ id }) => id === answers.source)!;
|
||||||
|
|
||||||
if (source.type === 'embed') {
|
if (source.type === 'embed') {
|
||||||
const sourceAnswers = await prompt<EmbedSourceAnswers>([
|
const sourceAnswers = await prompt<EmbedSourceAnswers>([
|
||||||
@@ -288,125 +408,6 @@ async function runCommandLine() {
|
|||||||
await processOptions(program.opts());
|
await processOptions(program.opts());
|
||||||
}
|
}
|
||||||
|
|
||||||
async function processOptions(options: CommandLineArguments) {
|
|
||||||
if (options.fetcher !== 'node-fetch' && options.fetcher !== 'native') {
|
|
||||||
throw new Error("Fetcher must be either 'native' or 'node-fetch'");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!options.sourceId.trim()) {
|
|
||||||
throw new Error('Source ID must be provided');
|
|
||||||
}
|
|
||||||
|
|
||||||
const source = sources.find((source) => source.id === options.sourceId);
|
|
||||||
|
|
||||||
if (!source) {
|
|
||||||
throw new Error('Invalid source ID. No source found');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (source.type === 'embed' && !options.url.trim()) {
|
|
||||||
throw new Error('Must provide an embed URL for embed sources');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (source.type === 'source') {
|
|
||||||
if (!options.tmdbId.trim()) {
|
|
||||||
throw new Error('Must provide a TMDB ID for provider sources');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isNaN(Number(options.tmdbId)) || Number(options.tmdbId) < 0) {
|
|
||||||
throw new Error('TMDB ID must be a number greater than 0');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!options.type.trim()) {
|
|
||||||
throw new Error('Must provide a type for provider sources');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (options.type !== 'movie' && options.type !== 'show') {
|
|
||||||
throw new Error("Invalid media type. Must be either 'movie' or 'show'");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (options.type === 'show') {
|
|
||||||
if (!options.season.trim()) {
|
|
||||||
throw new Error('Must provide a season number for TV shows');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!options.episode.trim()) {
|
|
||||||
throw new Error('Must provide an episode number for TV shows');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isNaN(Number(options.season)) || Number(options.season) <= 0) {
|
|
||||||
throw new Error('Season number must be a number greater than 0');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isNaN(Number(options.episode)) || Number(options.episode) <= 0) {
|
|
||||||
throw new Error('Episode number must be a number greater than 0');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let fetcher;
|
|
||||||
|
|
||||||
if (options.fetcher === 'native') {
|
|
||||||
fetcher = makeStandardFetcher(fetch as any);
|
|
||||||
} else {
|
|
||||||
fetcher = makeStandardFetcher(nodeFetch);
|
|
||||||
}
|
|
||||||
|
|
||||||
const providers = makeProviders({
|
|
||||||
fetcher,
|
|
||||||
target: targets.NATIVE,
|
|
||||||
});
|
|
||||||
|
|
||||||
await runScraper(providers, source, options);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function runScraper(providers: ProviderControls, source: MetaOutput, options: CommandLineArguments) {
|
|
||||||
const spinnies = new Spinnies();
|
|
||||||
|
|
||||||
if (source.type === 'embed') {
|
|
||||||
spinnies.add('scrape', { text: `Running ${source.name} scraper on ${options.url}` });
|
|
||||||
try {
|
|
||||||
const result = await providers.runEmbedScraper({
|
|
||||||
url: options.url,
|
|
||||||
id: source.id,
|
|
||||||
});
|
|
||||||
spinnies.succeed('scrape', { text: 'Done!' });
|
|
||||||
console.log(result);
|
|
||||||
} catch (error) {
|
|
||||||
let message = 'Unknown error';
|
|
||||||
if (error instanceof Error) {
|
|
||||||
message = error.message;
|
|
||||||
}
|
|
||||||
|
|
||||||
spinnies.fail('scrape', { text: `ERROR: ${message}` });
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
let media;
|
|
||||||
|
|
||||||
if (options.type === 'movie') {
|
|
||||||
media = await getMovieMediaDetails(options.tmdbId);
|
|
||||||
} else {
|
|
||||||
media = await getShowMediaDetails(options.tmdbId, options.season, options.episode);
|
|
||||||
}
|
|
||||||
|
|
||||||
spinnies.add('scrape', { text: `Running ${source.name} scraper on ${media.title}` });
|
|
||||||
try {
|
|
||||||
const result = await providers.runSourceScraper({
|
|
||||||
media,
|
|
||||||
id: source.id,
|
|
||||||
});
|
|
||||||
spinnies.succeed('scrape', { text: 'Done!' });
|
|
||||||
console.log(result);
|
|
||||||
} catch (error) {
|
|
||||||
let message = 'Unknown error';
|
|
||||||
if (error instanceof Error) {
|
|
||||||
message = error.message;
|
|
||||||
}
|
|
||||||
|
|
||||||
spinnies.fail('scrape', { text: `ERROR: ${message}` });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (process.argv.length === 2) {
|
if (process.argv.length === 2) {
|
||||||
runQuestions();
|
runQuestions();
|
||||||
} else {
|
} else {
|
||||||
|
Reference in New Issue
Block a user