Skip to content

Instantly share code, notes, and snippets.

@thefkboss
Forked from blacktwin/kill_trans_exp_audio.py
Created June 24, 2019 17:46
Show Gist options
  • Save thefkboss/f470c5617a48c91110a309188a276547 to your computer and use it in GitHub Desktop.
Save thefkboss/f470c5617a48c91110a309188a276547 to your computer and use it in GitHub Desktop.
Kill Plex video transcoding streams only. All audio streams are left alone. Kill message based on platform.
"""
Kill Plex video transcoding streams only. All audio streams are left alone.
PlexPy > Settings > Notification Agents > Scripts > Bell icon:
[X] Notify on playback start
PlexPy > Settings > Notification Agents > Scripts > Gear icon:
Playback Start: kill_trans_exp_audio.py
"""
import requests
import platform
from uuid import getnode
## EDIT THESE SETTINGS ##
PLEX_HOST = ''
PLEX_PORT = 32400
PLEX_SSL = '' # s or ''
PLEX_TOKEN = 'xxxxx'
DEFAULT_REASON = 'This stream has ended due to requiring video transcoding. ' \
'Please raise your Remote Quality to Original to play this content.'
# Find platforms that have history in PlexPy in Play count by platform and stream type Graph
DEVICES = {'Android': 'Andriod message',
'Chrome': 'Chrome message',
'Plex Media Player': 'PMP message',
'Chromecast': 'Chromecast message'}
USER_IGNORE = ('') # ('Username','User2')
##
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_stream(sessionId, message):
headers = {'X-Plex-Token': PLEX_TOKEN}
params = {'sessionId': sessionId,
'reason': message}
requests.get('http://{}:{}/status/sessions/terminate'.format(PLEX_HOST, PLEX_PORT),
headers=headers, params=params)
if __name__ == '__main__':
response = fetch('status/sessions')
if 'Video' in response['MediaContainer']:
for s in response['MediaContainer']['Video']:
if s['TranscodeSession']['videoDecision'] == 'transcode' and s['User']['title'] not in USER_IGNORE:
MESSAGE = DEVICES.get(s['Player']['platform'], DEFAULT_REASON)
print("Killing {}'s stream for transcoding video".format(s['User']['title']))
kill_stream(s['Session']['id'], MESSAGE)
elif 'Track' in response['MediaContainer']:
for s in response['MediaContainer']['Track']:
print("{} is streaming audio, let them pass!".format(s['User']['title']))
exit()
else:
exit()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment