diff --git a/.env.example b/.env.example index 8b04e72..8f89296 100644 --- a/.env.example +++ b/.env.example @@ -1,3 +1,4 @@ TRAKT_ID=YOUR_CLIENT_ID TRAKT_SECRET=YOUR_CLIENT_SECRET PORT=3090 +LOG_LEVEL=info diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 9d085f3..48d8808 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -6,8 +6,8 @@ name: Docker # documentation. on: - schedule: - - cron: '28 6 * * *' + # schedule: + # - cron: '28 6 * * *' push: branches: ['main'] # Publish semver tags as releases. diff --git a/package-lock.json b/package-lock.json index c333ea7..821bf81 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "scrobblex", - "version": "0.1.0", + "version": "0.3.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "scrobblex", - "version": "0.1.0", + "version": "0.3.3", "license": "MIT", "dependencies": { "axios": "^1.7.2", diff --git a/package.json b/package.json index 22552d8..b1ba08f 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": "0.3.3", + "version": "0.4.0", "main": "src/index.js", "type": "module", "license": "MIT", diff --git a/src/requests.js b/src/requests.js index 0898d14..7e5f7c1 100644 --- a/src/requests.js +++ b/src/requests.js @@ -1,5 +1,6 @@ import chalk from 'chalk'; import axios from 'axios'; +import { formatDistanceToNow } from 'date-fns'; import { logger } from './logger.js'; @@ -13,8 +14,14 @@ export const scrobbleRequest = async ({ action, body, access_token, title }) => 'trakt-api-version': '2', }, }); - logger.info(`📡 Scrobbling ${title} (${action})`); + logger.info(`📡 Scrobbling ${title} (${action} - ${body.progress}%)`); } catch (err) { + if (err.response.status == '409') { + logger.error( + `❌ ${chalk.red(`${title} has been scrobbled ${formatDistanceToNow(new Date(err.response.data.watched_at))} ago. Try again in ${formatDistanceToNow(new Date(err.response.data.expires_at))}.`)}`, + ); + return; + } logger.error(`❌ ${chalk.red(`Scrobble API error: ${err.message}`)}`); } }; diff --git a/src/utils.js b/src/utils.js index c47e1ba..cad511f 100644 --- a/src/utils.js +++ b/src/utils.js @@ -4,23 +4,22 @@ import { logger } from './logger.js'; import { scrobbleRequest, findEpisodeRequest, findMovieRequest } from './requests.js'; export const getAction = ({ event, viewOffset = 99.9, duration }) => { - const progress = Number.parseFloat((viewOffset / duration) * 100).toFixed(2); let res = { action: 'start', // start, pause, stop - progress: progress, //0, 90 + progress: 0, //0, 90 }; switch (event) { case 'media.play': res.action = 'start'; - res.progress = progress; + res.progress = 0; break; case 'media.pause': res.action = 'pause'; - res.progress = progress; + res.progress = 0; break; case 'media.resume': res.action = 'start'; - res.progress = progress; + res.progress = 0; break; case 'media.stop': res.action = 'stop'; @@ -28,7 +27,7 @@ export const getAction = ({ event, viewOffset = 99.9, duration }) => { break; case 'media.scrobble': res.action = 'stop'; - res.progress = progress; + res.progress = 90; break; } return res;