From 473a073dd6daaec7c5505579701544a94cf73d7c Mon Sep 17 00:00:00 2001 From: Landon Abney Date: Wed, 27 Jun 2018 14:40:32 -0700 Subject: [PATCH 1/4] Wrap message in quotes Now that Tautulli is sending the arguments correctly as of v2.1.14, wrap the kill messages in quotes so it's obvious where they start and stop. --- killstream/readme.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/killstream/readme.md b/killstream/readme.md index 5bf0465..2f5ec9a 100644 --- a/killstream/readme.md +++ b/killstream/readme.md @@ -11,7 +11,7 @@ Conditions: \[ `Transcode Decision` | `is` | `transcode` \] Arguments: ``` ---jbop stream --username {username} --sessionId {session_id} --killMessage Transcoding streams are not allowed. +--jbop stream --username {username} --sessionId {session_id} --killMessage 'Transcoding streams are not allowed.' ``` ### Kill non-local streams paused for a long time @@ -24,7 +24,7 @@ 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. +--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 @@ -36,7 +36,7 @@ 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. +--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 @@ -46,7 +46,7 @@ Conditions: \[ `Transcode Decision` | `is` | `transcode` \] Arguments: ``` ---jbop stream --username {username} --sessionId {session_id} --killMessage Paused streams are automatically stopped. +--jbop stream --username {username} --sessionId {session_id} --killMessage 'Paused streams are automatically stopped.' ``` ### Limit User stream count, kill last stream @@ -56,7 +56,7 @@ Conditions: \[ `User Streams` | `is greater than` | `3` \] Arguments: ``` ---jbop stream --username {username} --sessionId {session_id} --killMessage You are only allowed 3 streams. +--jbop stream --username {username} --sessionId {session_id} --killMessage 'You are only allowed 3 streams.' ``` ### IP Whitelist @@ -66,7 +66,7 @@ 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}. +--jbop stream --username {username} --sessionId {session_id} --killMessage '{ip_address} is not allowed to access {server_name}.' ``` ### Kill by platform @@ -76,7 +76,7 @@ Conditions: \[ `Platform` | `is` | `Roku or Android` \] Arguments: ``` ---jbop stream --username {username} --sessionId {session_id} --killMessage {platform} is not allowed on {server_name}. +--jbop stream --username {username} --sessionId {session_id} --killMessage '{platform} is not allowed on {server_name}.' ``` ### Kill transcode by library @@ -88,7 +88,7 @@ Conditions: Arguments: ``` ---jbop stream --username {username} --sessionId {session_id} --killMessage Transcoding streams are not allowed from the 4K Movies library. +--jbop stream --username {username} --sessionId {session_id} --killMessage 'Transcoding streams are not allowed from the 4K Movies library.' ``` ### Kill transcode by original resolution @@ -100,7 +100,7 @@ Conditions: Arguments: ``` ---jbop stream --username {username} --sessionId {session_id} --killMessage Transcoding streams are not allowed for {stream_video_resolution}p streams. +--jbop stream --username {username} --sessionId {session_id} --killMessage 'Transcoding streams are not allowed for {stream_video_resolution}p streams.' ``` ### Kill transcode by bitrate @@ -112,7 +112,7 @@ Conditions: Arguments: ``` ---jbop stream --username {username} --sessionId {session_id} --killMessage Transcoding streams are not allowed from over 4 Mbps (Yours: {stream_bitrate}). +--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 @@ -123,7 +123,7 @@ 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. +--jbop stream --username {username} --sessionId {session_id} --killMessage '{server_name} is unavailable between 9 and 10 AM.' ``` ### Kill non local streams @@ -132,7 +132,7 @@ Triggers: Playback Start Conditions: \[ `Stream Local` | `is not` | `1` \] Arguments: ``` ---jbop stream --username {username} --sessionId {session_id} --killMessage {server_name} only allows local streams. +--jbop stream --username {username} --sessionId {session_id} --killMessage '{server_name} only allows local streams.' ``` ### Kill transcodes and send a notification to agent 1 @@ -142,7 +142,7 @@ Conditions: \[ `Transcode Decision` | `is` | `transcode` \] Arguments: ``` ---jbop stream --username {username} --sessionId {session_id} --notify 1 --killMessage Transcoding streams are not allowed. +--jbop stream --username {username} --sessionId {session_id} --notify 1 --killMessage 'Transcoding streams are not allowed.' ``` ### Kill transcodes using the default message @@ -162,5 +162,5 @@ Conditions: \[ `Username` | `is` | `Bob` \] Arguments: ``` ---jbop allStreams --userId {user_id} --notify 1 --killMessage Hey Bob, we need to talk! +--jbop allStreams --userId {user_id} --notify 1 --killMessage 'Hey Bob, we need to talk!' ``` From 1e8e96398b80e8f80a95127e11996756242f9c47 Mon Sep 17 00:00:00 2001 From: JonnyWong16 Date: Fri, 29 Jun 2018 13:14:13 -0700 Subject: [PATCH 2/4] Decode script arguments --- killstream/kill_stream.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/killstream/kill_stream.py b/killstream/kill_stream.py index 110da98..36111d2 100644 --- a/killstream/kill_stream.py +++ b/killstream/kill_stream.py @@ -52,6 +52,7 @@ TAUTULLI_URL = '' TAUTULLI_APIKEY = '' TAUTULLI_URL = os.getenv('TAUTULLI_URL', TAUTULLI_URL) TAUTULLI_APIKEY = os.getenv('TAUTULLI_APIKEY', TAUTULLI_APIKEY) +TAUTULLI_ENCODING = os.getenv('TAUTULLI_ENCODING', 'UTF-8') SUBJECT_TEXT = "Tautulli has killed a stream." BODY_TEXT = "Killed session ID '{id}'. Reason: {message}" @@ -241,6 +242,10 @@ def terminate_long_pause(session_id, message, limit, interval, notify=None): return +def arg_decoding(arg): + return arg.decode(TAUTULLI_ENCODING) + + if __name__ == "__main__": parser = argparse.ArgumentParser( description="Killing Plex streams from Tautulli.") @@ -248,7 +253,7 @@ if __name__ == "__main__": help='Kill selector.\nChoices: (%(choices)s)') parser.add_argument('--userId', type=int, help='The unique identifier for the user.') - parser.add_argument('--username', + parser.add_argument('--username', type=arg_decoding, help='The username of the person streaming.') parser.add_argument('--sessionId', required=True, help='The unique identifier for the stream.') @@ -259,7 +264,7 @@ if __name__ == "__main__": help='The time session is allowed to remain paused.') parser.add_argument('--interval', type=int, default=30, help='The seconds between paused session checks.') - parser.add_argument('--killMessage', nargs='+', + parser.add_argument('--killMessage', nargs='+', type=arg_decoding, help='Message to send to user whose stream is killed.') opts = parser.parse_args() From 2bd92acca728dfd7c478a0dcfe59f3af2ed77aa7 Mon Sep 17 00:00:00 2001 From: JonnyWong16 Date: Fri, 29 Jun 2018 23:50:42 -0700 Subject: [PATCH 3/4] Encode back to UTF-8 --- killstream/kill_stream.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/killstream/kill_stream.py b/killstream/kill_stream.py index 36111d2..e927bc6 100644 --- a/killstream/kill_stream.py +++ b/killstream/kill_stream.py @@ -243,7 +243,7 @@ def terminate_long_pause(session_id, message, limit, interval, notify=None): def arg_decoding(arg): - return arg.decode(TAUTULLI_ENCODING) + return arg.decode(TAUTULLI_ENCODING).encode('UTF-8') if __name__ == "__main__": From c413526ec36f905dd24ed277bc3c6afd340a48d2 Mon Sep 17 00:00:00 2001 From: JonnyWong16 Date: Fri, 29 Jun 2018 23:58:24 -0700 Subject: [PATCH 4/4] Return empty list if get_activity fails --- killstream/kill_stream.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/killstream/kill_stream.py b/killstream/kill_stream.py index e927bc6..d592924 100644 --- a/killstream/kill_stream.py +++ b/killstream/kill_stream.py @@ -125,7 +125,7 @@ def get_activity(): except Exception as e: sys.stderr.write( "Tautulli API 'get_activity' request failed: {0}.\n".format(e)) - pass + return [] def get_user_session_ids(user_id):