Merge pull request #1213 from webstreamr/use-imdb-id

feat: allow to configure to always return IMDb ID instead of TMDB ID
This commit is contained in:
Silas Alves
2025-08-27 09:41:33 -03:00
committed by GitHub
6 changed files with 28 additions and 6 deletions
+3 -2
View File
@@ -119,6 +119,7 @@ async function getManifest(config) {
const language = config.language || DEFAULT_LANGUAGE;
const tmdbPrefix = config.tmdbPrefix === "true";
const provideImdbId = config.provideImdbId === "true";
const returnImdbId = config.returnImdbId === "true";
const sessionId = config.sessionId;
const userCatalogs = config.catalogs || getDefaultCatalogs();
const translatedCatalogs = loadTranslations(language);
@@ -210,7 +211,7 @@ async function getManifest(config) {
`Language: ${language}`,
`TMDB Account: ${sessionId ? 'Connected' : 'Not Connected'}`,
`MDBList Integration: ${config.mdblistkey ? 'Connected' : 'Not Connected'}`,
`IMDb Integration: ${provideImdbId ? 'Enabled' : 'Disabled'}`,
`IMDb Integration: ${provideImdbId || returnImdbId ? "Enabled" : "Disabled"}`,
`RPDB Integration: ${config.rpdbkey ? 'Enabled' : 'Disabled'}`,
`Search: ${config.searchEnabled !== "false" ? 'Enabled' : 'Disabled'}`,
`Active Catalogs: ${catalogs.length}`
@@ -226,7 +227,7 @@ async function getManifest(config) {
description: "Stremio addon that provides rich metadata for movies and TV shows from TMDB, featuring customizable catalogs, multi-language support, favorites lists, watchlist, ratings, and IMDb integration. Current settings: " + activeConfigs,
resources: ["catalog", "meta"],
types: ["movie", "series"],
idPrefixes: provideImdbId ? ["tmdb:", "tt"] : ["tmdb:"],
idPrefixes: provideImdbId || returnImdbId ? ["tmdb:", "tt"] : ["tmdb:"],
stremioAddonsConfig,
behaviorHints: {
configurable: true,
+4 -2
View File
@@ -64,6 +64,7 @@ const buildMovieResponse = async (res, type, language, tmdbId, rpdbkey, config =
const imdbRating = imdbRatingRaw || res.vote_average?.toFixed(1) || "N/A";
const castCount = config.castCount !== undefined ? Math.max(1, Math.min(5, Number(config.castCount))) : 5;
const returnImdbId = config.returnImdbId === true || config.returnImdbId === "true";
const hideInCinemaTag = config.hideInCinemaTag === true || config.hideInCinemaTag === "true";
const response = {
@@ -83,7 +84,7 @@ const buildMovieResponse = async (res, type, language, tmdbId, rpdbkey, config =
background: `https://image.tmdb.org/t/p/original${res.backdrop_path}`,
poster,
runtime: Utils.parseRunTime(res.runtime),
id: `tmdb:${tmdbId}`,
id: returnImdbId ? res.imdb_id : `tmdb:${tmdbId}`,
genres: Utils.parseGenres(res.genres),
releaseInfo: res.release_date ? res.release_date.substr(0, 4) : "",
trailerStreams: Utils.parseTrailerStream(res.videos),
@@ -130,6 +131,7 @@ const buildTvResponse = async (res, type, language, tmdbId, rpdbkey, config = {}
const imdbRating = imdbRatingRaw || res.vote_average?.toFixed(1) || "N/A";
const castCount = config.castCount !== undefined ? Math.max(1, Math.min(5, Number(config.castCount))) : 5;
const returnImdbId = config.returnImdbId === true || config.returnImdbId === "true";
const hideInCinemaTag = config.hideInCinemaTag === true || config.hideInCinemaTag === "true";
const response = {
@@ -148,7 +150,7 @@ const buildTvResponse = async (res, type, language, tmdbId, rpdbkey, config = {}
year: Utils.parseYear(res.status, res.first_air_date, res.last_air_date),
background: `https://image.tmdb.org/t/p/original${res.backdrop_path}`,
slug: Utils.parseSlug(type, res.name, res.external_ids.imdb_id),
id: `tmdb:${tmdbId}`,
id: returnImdbId ? res.imdb_id : `tmdb:${tmdbId}`,
genres: Utils.parseGenres(res.genres),
releaseInfo: Utils.parseYear(res.status, res.first_air_date, res.last_air_date),
videos: episodes || [],
+4
View File
@@ -19,6 +19,7 @@ export function ConfigProvider({ children }: { children: React.ReactNode }) {
const [mdblistkey, setMdblistkey] = useState("");
const [includeAdult, setIncludeAdult] = useState(false);
const [provideImdbId, setProvideImdbId] = useState(false);
const [returnImdbId, setReturnImdbId] = useState(false);
const [tmdbPrefix, setTmdbPrefix] = useState(false);
const [hideEpisodeThumbnails, setHideEpisodeThumbnails] = useState(false);
const [language, setLanguage] = useState("en-US");
@@ -49,6 +50,7 @@ export function ConfigProvider({ children }: { children: React.ReactNode }) {
if (config.mdblistkey) setMdblistkey(config.mdblistkey);
if (config.geminikey) setGeminiKey(config.geminikey);
if (config.provideImdbId) setProvideImdbId(config.provideImdbId === "true");
if (config.returnImdbId) setReturnImdbId(config.returnImdbId === "true");
if (config.tmdbPrefix) setTmdbPrefix(config.tmdbPrefix === "true");
if (config.hideEpisodeThumbnails) setHideEpisodeThumbnails(config.hideEpisodeThumbnails === "true");
if (config.sessionId) setSessionId(config.sessionId);
@@ -106,6 +108,7 @@ export function ConfigProvider({ children }: { children: React.ReactNode }) {
mdblistkey,
includeAdult,
provideImdbId,
returnImdbId,
tmdbPrefix,
hideEpisodeThumbnails,
language,
@@ -121,6 +124,7 @@ export function ConfigProvider({ children }: { children: React.ReactNode }) {
setMdblistkey,
setIncludeAdult,
setProvideImdbId,
setReturnImdbId,
setTmdbPrefix,
setHideEpisodeThumbnails,
setLanguage,
+2
View File
@@ -14,6 +14,7 @@ export type ConfigContextType = {
mdblistkey: string;
includeAdult: boolean;
provideImdbId: boolean;
returnImdbId: boolean;
tmdbPrefix: boolean;
hideEpisodeThumbnails: boolean;
language: string;
@@ -29,6 +30,7 @@ export type ConfigContextType = {
setMdblistkey: (mdblistkey: string) => void;
setIncludeAdult: (includeAdult: boolean) => void;
setProvideImdbId: (provideImdbId: boolean) => void;
setReturnImdbId: (returnImdbId: boolean) => void;
setTmdbPrefix: (tmdbPrefix: boolean) => void;
setHideEpisodeThumbnails: (hideEpisodeThumbnails: boolean) => void;
setLanguage: (language: string) => void;
+1
View File
@@ -40,6 +40,7 @@ export function generateAddonUrl(config: AddonConfig): string {
})),
includeAdult: config.includeAdult === true ? "true" : undefined,
provideImdbId: config.provideImdbId === true ? "true" : undefined,
returnImdbId: config.returnImdbId === true ? "true" : undefined,
tmdbPrefix: config.tmdbPrefix === true ? "true" : undefined,
hideEpisodeThumbnails: config.hideEpisodeThumbnails === true ? "true" : undefined,
searchEnabled: config.searchEnabled === false ? "false" : undefined,
+14 -2
View File
@@ -8,6 +8,7 @@ const Others = () => {
const { hideEpisodeThumbnails, setHideEpisodeThumbnails } = useConfig();
const { includeAdult, setIncludeAdult } = useConfig();
const { provideImdbId, setProvideImdbId } = useConfig();
const { returnImdbId, setReturnImdbId } = useConfig();
const { tmdbPrefix, setTmdbPrefix } = useConfig();
const { hideInCinemaTag, setHideInCinemaTag } = useConfig();
const { castCount, setCastCount } = useConfig();
@@ -43,15 +44,26 @@ const Others = () => {
<Card className="flex flex-row items-center justify-between p-4 sm:p-6 hover:shadow-lg transition-shadow cursor-pointer">
<div className="space-y-0.5">
<h1 className="text-sm font-semibold mb-1">
Provide IMDB metadata
Provide IMDb metadata
</h1>
<p className="text-gray-500 text-sm">
Include IMDB IDs in metadata for better integration with other
Include items with IMDb IDs when handling metadata requests for better integration with other
addons.
</p>
</div>
<Switch checked={provideImdbId} onCheckedChange={() => setProvideImdbId(!provideImdbId)} />
</Card>
<Card className="flex flex-row items-center justify-between p-4 sm:p-6 hover:shadow-lg transition-shadow cursor-pointer">
<div className="space-y-0.5">
<h1 className="text-sm font-semibold mb-1">
Return IMDb ID
</h1>
<p className="text-gray-500 text-sm">
Return only items with IMDb IDs in catalogues for better integration with other addons.
</p>
</div>
<Switch checked={returnImdbId} onCheckedChange={() => setReturnImdbId(!returnImdbId)} />
</Card>
<Card className="flex flex-row items-center justify-between p-4 sm:p-6 hover:shadow-lg transition-shadow cursor-pointer">
<div className="space-y-0.5">
<h1 className="text-sm font-semibold mb-1">Use TMDB prefix</h1>