JBOPS/killstream
dirtycajunrice f9ce8eae63 removed all instances of shadow of outer scope, made explicit from
implicit inheritance, defined a few docstring params, initialized 2 vars
2018-12-19 19:57:30 -06:00
..
kill_else_if_buffering.py fix for title and transcode sessions 2018-11-19 23:41:58 -05:00
kill_stream.py removed all instances of shadow of outer scope, made explicit from 2018-12-19 19:57:30 -06:00
limiterr_readme.md 24 is not valid. 0 instead. 2018-12-06 10:16:03 -05:00
limiterr.py docstring --today 2018-10-24 00:43:39 -04:00
readme.md moved to bullet points for uniformity with conditions 2018-12-19 18:02:31 -06:00

README

Killing streams is a Plex Pass only feature. So these scripts will only work for Plex Pass users.

kill_stream.py examples:

Kill transcodes

Triggers:

  • Playback Start
  • Transcode Decision Change

Conditions: [ Transcode Decision | is | transcode ]

Arguments:

--jbop stream --username {username} --sessionId {session_id} --killMessage 'Transcoding streams are not allowed.'

Kill non-local streams paused for a long time

The default values will kill anything paused for over 20 minutes, checking every 30 seconds.

Script Timeout: 0 Important!
Triggers: Playback Paused
Conditions: [ Stream Local | is not | 1 ]

Arguments:

--jbop paused --sessionId {session_id} --killMessage 'Your stream was paused for over 20 minutes and has been automatically stopped for you.'

Kill streams paused for a custom time

This is an example of customizing the paused stream monitoring to check every 15 seconds, and kill any stream paused for over 5 minutes.

Script Timeout: 0 Important!
Triggers: Playback Paused

Arguments:

--jbop paused --interval 15 --limit 300 --sessionId {session_id} --killMessage 'Your stream was paused for over 5 minutes and has been automatically stopped for you.'

Kill paused transcodes

Triggers: Playback Paused
Conditions: [ Transcode Decision | is | transcode ]

Arguments:

--jbop stream --username {username} --sessionId {session_id} --killMessage 'Paused streams are automatically stopped.'

Limit User stream count, kill last stream

Triggers: Playback Start
Conditions: [ User Streams | is greater than | 3 ]

Arguments:

--jbop stream --username {username} --sessionId {session_id} --killMessage 'You are only allowed 3 streams.'

IP Whitelist

Triggers: Playback Start
Conditions: [ IP Address | is not | 192.168.0.100 or 192.168.0.101 ]

Arguments:

--jbop stream --username {username} --sessionId {session_id} --killMessage '{ip_address} is not allowed to access {server_name}.'

Kill by platform

Triggers: Playback Start
Conditions: [ Platform | is | Roku or Android ]

Arguments:

--jbop stream --username {username} --sessionId {session_id} --killMessage '{platform} is not allowed on {server_name}.'

Kill transcode by library

Triggers:

  • Playback Start
  • Transcode Decision Change

Conditions:

  •  `Transcode Decision` | `is` | `transcode` 
  •  `Library Name` | `is` | `4K Movies` 

Arguments:

--jbop stream --username {username} --sessionId {session_id} --killMessage 'Transcoding streams are not allowed from the 4K Movies library.'

Kill transcode by original resolution

Triggers:

  • Playback Start
  • Transcode Decision Change

Conditions:

  •  `Transcode Decision` | `is` | `transcode` 
  •  `Video Resolution` | `is` | `1080 or 720`

Arguments:

--jbop stream --username {username} --sessionId {session_id} --killMessage 'Transcoding streams are not allowed for {stream_video_resolution}p streams.'

Kill transcode by bitrate

Triggers:

  • Playback Start
  • Transcode Decision Change

Conditions:

  •  `Transcode Decision` | `is` | `transcode` 
  •  `Bitrate` | `is greater than` | `4000` 

Arguments:

--jbop stream --username {username} --sessionId {session_id} --killMessage 'Transcoding streams are not allowed from over 4 Mbps (Yours: {stream_bitrate}).'

Kill by hours of the day

Kills any streams during 9 AM to 10 AM.

Triggers: Playback Start
Conditions: [ Timestamp | begins with | 09 or 10 ]
Arguments:

--jbop stream --username {username} --sessionId {session_id} --killMessage '{server_name} is unavailable between 9 and 10 AM.'

Kill non local streams

Triggers: Playback Start
Conditions: [ Stream Local | is not | 1 ]
Arguments:

--jbop stream --username {username} --sessionId {session_id} --killMessage '{server_name} only allows local streams.'

Kill transcodes and send a notification to agent 1

Triggers:

  • Playback Start
  • Transcode Decision Change

Conditions: [ Transcode Decision | is | transcode ]

Arguments:

--jbop stream --username {username} --sessionId {session_id} --notify 1 --killMessage 'Transcoding streams are not allowed.'

Kill transcodes using the default message

Triggers:

  • Playback Start
  • Transcode Decision Change

Conditions: [ Transcode Decision | is | transcode ]

Arguments:

--jbop stream --username {username} --sessionId {session_id}

Kill all of a user's streams with notification

Triggers: Playback Start
Conditions: [ Username | is | Bob ]

Arguments:

--jbop allStreams --userId {user_id} --notify 1 --killMessage 'Hey Bob, we need to talk!'

Rich Notifications (Discord or Slack)

The following can be added to any of the above examples.

How it Works

Tautulli > Script Agent > Script > Tautulli > Webhook Agent > Discord/Slack

  1. Tautulli's script agent is executed
  2. Script executes
  3. The script sends the JSON data to the webhook agent
  4. Webhook agent passes the information to Discord/Slack

Limitations

  • Due to size limitations by Slack. A thumbnail may not appear with every notification when using --posterUrl {poster_url}.
  • allStreams will not have poster images in the notifications.

Required arguments

  • Discord: --notify notifierID --richMessage discord
  • Slack: --notify notifierID --richMessage slack

Note: The notifierID must be a Webhook in Tautulli

Optional arguments

--serverName {server_name} --plexUrl {plex_url} --posterUrl {poster_url} --richColor '#E5A00D'

Webhook Setup

  1. Settings -> Notification Agents -> Add a new notification agent -> Webhook
  2. For the Webhook URL enter your Slack or Discord webhook URL.
    Some examples:
  3. Webhook Method - POST
  4. No triggers or any other configuration is needed. The script will pass the notifier the data to send to Discord/Slack.

Debug

Add --debug to enable debug logging.

Conditions considerations

Kill transcode variants

All examples use [ Transcode Decision | is | transcode ] which will kill any variant of transcoding. If you want to allow audio or container transcoding and only drop video transcodes, your condition would change to

 `Video Decision` | `is` | `transcode`