├── .gitignore ├── README.md ├── index.js └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .idea/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | In order to run this app: 2 | 3 | - Install [node.js](https://nodejs.org/en/). 4 | - Clone the repository. 5 | - Install dependencies using `npm install`. 6 | - Get your key from the Maker channel on IFTTT 7 | - Add your key to the 'key' variable in the script 8 | 9 | - Run like this: 10 | 11 | ``` 12 | node index.js 13 | ``` 14 | 15 | - Add the webhook to https://app.plex.tv/web/app#!/account/webhooks 16 | - In this case the webhook would be: 17 | ``` 18 | http://localhost:12000 19 | ``` 20 | 21 | - Used in conjunction with the follow IFTTT recipe: https://ifttt.com/applets/49465061d-log-everything-plex-plays 22 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var express = require('express') 2 | , request = require('request') 3 | , multer = require('multer'); 4 | 5 | var app = express(); 6 | var upload = multer({ dest: '/tmp/' }); 7 | 8 | var key = ''; 9 | 10 | app.post('/', upload.single('thumb'), function (req, res, next) { 11 | var payload = JSON.parse(req.body.payload); 12 | //console.log('Got webhook for', payload.event); 13 | 14 | var options = { 15 | method: 'PUT', 16 | json: true, 17 | }; 18 | 19 | //Ensure IFTTT's Maker channel is set to digest Plex.Play, Plex.Resume, .. events 20 | //If you want to control lights in particular 'Plex Rooms' you can look into payload.Player.title to send a customer event based on the player (ensure you have a unique name for each player configured in Plex). 21 | switch (payload.event) { 22 | case 'media.play': 23 | // Trigger IFTTT_Plex.Play 24 | //console.log('IFTTT_Plex.Play'); 25 | options.url = 'https://maker.ifttt.com/trigger/Plex.Play/with/key/' + key; 26 | //options.body = { value1: payload.Account.title, value2: payload.Metadata.title, value3: payload.Player.title }; 27 | //request(options); 28 | break; 29 | case 'media.resume': 30 | // Trigger IFTTT_Plex.Resume 31 | //console.log('IFTTT_Plex.Resume'); 32 | options.url = 'https://maker.ifttt.com/trigger/Plex.Resume/with/key/' + key; 33 | //request(options); 34 | break; 35 | case 'media.pause': 36 | // Trigger IFTTT_Plex.Pause 37 | //console.log('IFTTT_Plex.Pause'); 38 | options.url = 'https://maker.ifttt.com/trigger/Plex.Pause/with/key/' + key; 39 | //request(options); 40 | break; 41 | case 'media.stop': 42 | // Trigger IFTTT_Plex.Stop 43 | //console.log('IFTTT_Plex.Stop'); 44 | options.url = 'https://maker.ifttt.com/trigger/Plex.Stop/with/key/' + key; 45 | //request(options); 46 | break; 47 | } 48 | 49 | switch (payload.Metadata.librarySectionType) { 50 | case 'show': 51 | options.body = { value1: payload.Account.title, value2: payload.Player.title, value3: (payload.Metadata.grandparentTitle + ' - ' + payload.Metadata.title) }; 52 | break; 53 | case 'movie': 54 | options.body = { value1: payload.Account.title, value2: payload.Player.title, value3: payload.Metadata.title }; 55 | break; 56 | case 'artist': 57 | options.body = { value1: payload.Account.title, value2: payload.Player.title, value3: (payload.Metadata.grandparentTitle + ' - ' + payload.Metadata.parentTitle + ' - ' + payload.Metadata.title) }; 58 | break; 59 | default: 60 | } 61 | 62 | request(options); 63 | 64 | res.sendStatus(200); 65 | }); 66 | 67 | app.listen(12000); 68 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "plex-notifications", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": {}, 6 | "dependencies": { 7 | "express": "^4.14.0", 8 | "multer": "^1.3.0", 9 | "request": "^2.79.0" 10 | }, 11 | "devDependencies": {} 12 | } 13 | --------------------------------------------------------------------------------