From d8aff31cbfaa278427f8030e316322aad4989694 Mon Sep 17 00:00:00 2001 From: Ricardo Gonzalez Date: Tue, 25 Feb 2025 00:57:58 +0000 Subject: [PATCH 1/3] =?UTF-8?q?=F0=9F=90=9B=20Fix=20Dockerfile=20ENV=20syn?= =?UTF-8?q?tax?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index b889238..6848727 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,9 +8,9 @@ LABEL org.opencontainers.image.licenses="MIT" ENV NODE_ENV=production ENV PORT=3090 -ENV PORT $PORT +ENV PORT=$PORT ENV LOG_LEVEL=info -ENV LOG_LEVEL $LOG_LEVEL +ENV LOG_LEVEL=$LOG_LEVEL RUN apk --no-cache add curl From 72934c8f0bcd2eda4cb6320fa8dce9f9ef1dd126 Mon Sep 17 00:00:00 2001 From: Ricardo Gonzalez Date: Tue, 25 Feb 2025 14:03:24 +0000 Subject: [PATCH 2/3] =?UTF-8?q?=E2=9C=A8=20Try=20all=20the=20services=20in?= =?UTF-8?q?=20search=20before=20giving=20up?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/requests.js | 154 ++++++++++++++++++++++++------------------------ src/utils.js | 13 ++-- 2 files changed, 85 insertions(+), 82 deletions(-) diff --git a/src/requests.js b/src/requests.js index a998cd3..488a691 100644 --- a/src/requests.js +++ b/src/requests.js @@ -3,7 +3,7 @@ import { formatDistanceToNow } from 'date-fns'; import { logger } from './logger.js'; import { api } from './api.js'; -import { GetGuid } from './utils.js'; +import { GetGuids } from './utils.js'; export const scrobbleRequest = async ({ action, body, title }) => { try { @@ -40,96 +40,96 @@ export const rateRequest = async ({ body, title, rating }) => { export const findMovieRequest = async (payload) => { - const { service, id } = GetGuid({ payload }) - - if (service && id) { - logger.info(`🔍 Finding movie info for ${payload.Metadata.title} (${payload.Metadata.year}) using ${service}://${id}`); - - } else { - logger.error(`❌ ${chalk.red(`No GUID available`)}`); - return - } - - try { - const response = await api.get(`https://api.trakt.tv/search/${service}/${id}?type=movie`, { ttl: 1000 * 60 * 180 }); - if (!response.data.length) { - logger.error(`❌ ${chalk.red(`Response was empty!`)}`); - return + const guids = GetGuids({ payload }); + + for (const { service, id } of guids) { + if (service && id) { + logger.info(`🔍 Finding movie info for ${payload.Metadata.title} (${payload.Metadata.year}) using ${service}://${id}`); + + try { + const response = await api.get(`https://api.trakt.tv/search/${service}/${id}?type=movie`, { ttl: 1000 * 60 * 180 }); + logger.debug(JSON.stringify(response.data, null, 2)); + if (response.data.length) { + const movie = response.data[0].movie; + const { title, year } = movie; + logger.info(`🎬 Movie found: ${title} (${year})`); + return movie; + } else { + logger.error(`❌ ${chalk.red(`Response from ${service} was empty!`)}`); + } + } catch (err) { + logger.error(`❌ ${chalk.red(`Search movie API error: ${err.message}`)}`); + } + } else { + logger.error(`❌ ${chalk.red(`No GUID available`)}`); } - const movie = response.data[0].movie; - const { title, year } = movie; - logger.info(`🎬 Movie found: ${title} (${year})`); - - return movie; - } catch (err) { - // Error handling here - logger.error(`❌ ${chalk.red(`Search movie API error: ${err.message}`)}`); } + + logger.error(`❌ ${chalk.red(`No movie found for any GUIDs`)}`); + return null; }; export const findEpisodeRequest = async (payload) => { - const { service, id } = GetGuid({ payload }) - - if (service && id) { - logger.info( - `🔍 Finding episode info for ${payload.Metadata.grandparentTitle} (${payload.Metadata.year}) - ${payload.Metadata.parentTitle} - ${payload.Metadata.title} using ${service}://${id}`, - ); - } else { - logger.error(`❌ ${chalk.red(`No GUID available`)}`); - return - } - - try { - const response = await api.get(`/search/${service}/${id}?type=episode`, { ttl: 1000 * 60 * 180 }); - logger.debug(`/search/${service}/${id}?type=episode`) - logger.debug(JSON.stringify(response.data, null, 2)); - if (!response.data.length) { - logger.error(`❌ ${chalk.red(`Response was empty!`)}`); - return + const guids = GetGuids({ payload }); + + for (const { service, id } of guids) { + if (service && id) { + logger.info( + `🔍 Finding episode info for ${payload.Metadata.grandparentTitle} (${payload.Metadata.year}) - ${payload.Metadata.parentTitle} - ${payload.Metadata.title} using ${service}://${id}`, + ) + try { + const response = await api.get(`https://api.trakt.tv/search/${service}/${id}?type=episode`, { ttl: 1000 * 60 * 180 }); + logger.debug(JSON.stringify(response.data, null, 2)); + if (response.data.length) { + const episode = response.data[0].episode; + const { title, season, number } = episode; + logger.info(`📺 Episode found: ${title} (Season ${season}, Episode ${number})`); + return episode; + } else { + logger.error(`❌ ${chalk.red(`Response from ${service} was empty!`)}`); + } + } catch (err) { + logger.error(`❌ ${chalk.red(`Search episode API error: ${err.message}`)}`); + } + } else { + logger.error(`❌ ${chalk.red(`No GUID available`)}`); } - const { episode, show } = response.data[0]; - logger.info( - `📺 Episode found: ${show.title} (${show.year}) - S${episode.season.toString().padStart(2, '0')}E${episode.number.toString().padStart(2, '0')} - ${episode.title}`, - ); - return episode; - } catch (err) { - logger.error(`❌ ${chalk.red(`Search episode API error: ${err.message}`)}`); } + + logger.error(`❌ ${chalk.red(`No episode found for any GUIDs`)}`); + return null; }; export const findShowRequest = async (payload) => { - const { service, id } = GetGuid({ payload }) - - if (service && id) { - logger.info( - `🔍 Finding show info for ${payload.Metadata.title} (${payload.Metadata.year}) using ${service}://${id}`, - ); - - } else { - logger.error(`❌ ${chalk.red(`No GUID available`)}`); - return - } - - try { - const response = await api.get(`/search/${service}/${id}?type=show`, { ttl: 1000 * 60 * 180 }); - logger.debug(JSON.stringify(payload, null, 2)); - logger.debug(JSON.stringify(response.data, null, 2)); - if (!response.data.length) { - logger.error(`❌ ${chalk.red(`Response was empty!`)}`); - return + const guids = GetGuids({ payload }); + + for (const { service, id } of guids) { + if (service && id) { + logger.info(`🔍 Finding show info for ${payload.Metadata.title} (${payload.Metadata.year}) using ${service}://${id}`); + + try { + const response = await api.get(`https://api.trakt.tv/search/${service}/${id}?type=show`, { ttl: 1000 * 60 * 180 }); + logger.debug(JSON.stringify(response.data, null, 2)); + if (response.data.length) { + const show = response.data[0].show; + const { title, year } = show; + logger.info(`📺 Show found: ${title} (${year})`); + return show; + } else { + logger.error(`❌ ${chalk.red(`Response from ${service} was empty!`)}`); + } + } catch (err) { + logger.error(`❌ ${chalk.red(`Search show API error: ${err.message}`)}`); + } + } else { + logger.error(`❌ ${chalk.red(`No GUID available`)}`); } - const { show } = response.data[0]; - // logger.debug(JSON.stringify(show, null, 2)); - logger.info( - `📺 Show found: ${show.title} (${show.year})`, - ); - return show; - } catch (err) { - logger.error(`❌ ${chalk.red(`Search show API error: ${err.message}`)}`); } -}; + logger.error(`❌ ${chalk.red(`No show found for any GUIDs`)}`); + return null; +}; export const findSeasonRequest = async (payload) => { logger.info( diff --git a/src/utils.js b/src/utils.js index f25613c..5d2e58c 100644 --- a/src/utils.js +++ b/src/utils.js @@ -216,7 +216,7 @@ export const handleRatingMovie = async ({ payload }) => { rateRequest({ body, title, rating }); }; -export const GetGuid = ({ payload }) => { +export const GetGuids = ({ payload }) => { const Guid = payload?.Metadata?.Guid; if (!Guid) { @@ -224,10 +224,13 @@ export const GetGuid = ({ payload }) => { return; } - const service = Guid[0]?.id?.substring(0, 4) - const id = Guid[0]?.id?.substring(7) + const guids = Guid.map(guid => { + const service = guid?.id?.substring(0, 4); + const id = guid?.id?.substring(7); + return { service, id }; + }); - logger.debug(`service: ${service} | id: ${id}`); + logger.debug(`services and ids: ${JSON.stringify(guids)}`); - return { service, id } + return guids; } \ No newline at end of file From 97abe84398db32141d6610088e1836f83f02448c Mon Sep 17 00:00:00 2001 From: Ricardo Gonzalez Date: Tue, 25 Feb 2025 14:04:42 +0000 Subject: [PATCH 3/3] =?UTF-8?q?=E2=AC=86=EF=B8=8F=201.3.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 848eb55..9c970f7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "scrobblex", "description": "Self-hosted app that enables Plex scrobbling integration with Trakt via webhooks", - "version": "1.2.1", + "version": "1.3.0", "homepage": "https://github.com/ryck/scrobblex", "repository": { "type": "git",