Skip to content

Instantly share code, notes, and snippets.

@blacktwin
Last active September 29, 2017 17:10
Show Gist options
  • Select an option

  • Save blacktwin/163f3e60557c6a3e66ab5d28cc78fd1c to your computer and use it in GitHub Desktop.

Select an option

Save blacktwin/163f3e60557c6a3e66ab5d28cc78fd1c to your computer and use it in GitHub Desktop.
Kills Plex transcode stream if paused. Set in PlexPy to be triggered when a user pauses or run manually.
'''
kill_transcode function from https://gist.github.com/Hellowlol/ee47b6534410b1880e19
PlexPy > Settings > Notification Agents > Scripts > Bell icon:
[X] Notify on pause
PlexPy > Settings > Notification Agents > Scripts > Gear icon:
Playback Pause: kill_trans_pause.py
'''
import requests
import sys
import json
import platform
from uuid import getnode
## EDIT THESE SETTINGS ##
PLEX_HOST = ''
PLEX_PORT = 32400
PLEX_SSL = '' # s or ''
PLEX_TOKEN = '<token>'
PLEXPY_APIKEY = 'XXXXXX' # Your PlexPy API key
PLEXPY_URL = 'http://localhost:8181/' # Your PlexPy URL
ignore_lst = [] # ['username1', 'username2']
class Activity(object):
def __init__(self, data=None):
d = data or {}
self.rating_key = d['rating_key']
self.title = d['full_title']
self.user = d['user']
self.user_id = d['user_id']
self.video_decision = d['video_decision']
self.transcode_decision = d['transcode_decision']
self.transcode_key = d['transcode_key']
self.state = d['state']
def get_get_activity():
# Get the current activity on the PMS.
payload = {'apikey': PLEXPY_APIKEY,
'cmd': 'get_activity'}
try:
r = requests.get(PLEXPY_URL.rstrip('/') + '/api/v2', params=payload)
response = r.json()
res_data = response['response']['data']['sessions']
return [Activity(data=d) for d in res_data]
except Exception as e:
sys.stderr.write("PlexPy API 'get_activity' request failed: {0}.".format(e))
def fetch(path, t='GET'):
url = 'http%s://%s:%s/' % (PLEX_SSL, PLEX_HOST, PLEX_PORT)
headers = {'X-Plex-Token': PLEX_TOKEN,
'Accept': 'application/json',
'X-Plex-Provides': 'controller',
'X-Plex-Platform': platform.uname()[0],
'X-Plex-Platform-Version': platform.uname()[2],
'X-Plex-Product': 'Plexpy script',
'X-Plex-Version': '0.9.5',
'X-Plex-Device': platform.platform(),
'X-Plex-Client-Identifier': str(hex(getnode()))
}
try:
if t == 'GET':
r = requests.get(url + path, headers=headers, verify=False)
elif t == 'POST':
r = requests.post(url + path, headers=headers, verify=False)
elif t == 'DELETE':
r = requests.delete(url + path, headers=headers, verify=False)
if r and len(r.content): # incase it dont return anything
return r.json()
else:
return r.content
except Exception as e:
print e
def kill_transcode(transcode_key):
print fetch('video/:/transcode/universal/stop?session=' + transcode_key)
activity = get_get_activity()
for a in activity:
if a.state == 'paused' and a.transcode_decision == 'transcode' and a.user not in ignore_lst and a.transcode_key:
sys.stdout.write("Killing {a.user}'s transcode stream of {a.title}".format(a=a))
kill_transcode(a.transcode_key)
@Tangoes
Copy link
Copy Markdown

Tangoes commented Mar 13, 2017

Hi! Sorry for my zero python knowledge, but, is it possible to kill the transcode IF the user pauses more than X seconds?

@blacktwin
Copy link
Copy Markdown
Author

@Tangoes Yes, try this.

@carnivorouz
Copy link
Copy Markdown

Is it just me or did this stop working with Plex 1.6.1.3722. I now get the error: " Got a request to stop a transcode session without a session GUID (or with an invalid one). " in the Plex Media Server logs. Tried googling around but it looks to be separate issues from 2014/2015.

@blacktwin
Copy link
Copy Markdown
Author

Looks like the Plex update made this obsolete. Here is a similar script that uses Plex's new kill stream.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment