Last active
May 3, 2024 07:09
-
-
Save JonnyWong16/4cfcf8ea50dab1b720b4d30e9a01835c to your computer and use it in GitHub Desktop.
Automatically add a label to recently added items in your Plex library
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
# | |
# Description: Automatically add a label to recently added items in your Plex library | |
# Author: /u/SwiftPanda16 | |
# Requires: requests | |
# Tautulli script trigger: | |
# * Notify on recently added | |
# Tautulli script conditions: | |
# * Filter which media to add labels to using conditions. Examples: | |
# [ Media Type | is | movie ] | |
# [ Show Name | is | Game of Thrones ] | |
# [ Album Name | is | Reputation ] | |
# [ Video Resolution | is | 4k ] | |
# [ Genre | contains | horror ] | |
# Tautulli script arguments: | |
# * Recently Added: | |
# --title {title} --section_id {section_id} --media_type {media_type} --rating_key {rating_key} --parent_rating_key {parent_rating_key} --grandparent_rating_key {grandparent_rating_key} --label "Label" | |
import argparse | |
import os | |
import requests | |
### OVERRIDES - ONLY EDIT IF RUNNING SCRIPT WITHOUT TAUTULLI ### | |
PLEX_URL = '' | |
PLEX_TOKEN = '' | |
### CODE BELOW ### | |
PLEX_URL = PLEX_URL or os.getenv('PLEX_URL', PLEX_URL) | |
PLEX_TOKEN = PLEX_TOKEN or os.getenv('PLEX_TOKEN', PLEX_TOKEN) | |
MEDIA_TYPES_PARENT_VALUES = {'movie': 1, 'show': 2, 'season': 2, 'episode': 2, 'album': 9, 'track': 9} | |
def add_label(media_type_value, rating_key, section_id, label): | |
headers = {'X-Plex-Token': PLEX_TOKEN} | |
params = {'type': media_type_value, | |
'id': rating_key, | |
'label.locked': 1, | |
'label[0].tag.tag': label | |
} | |
url = '{base_url}/library/sections/{section_id}/all'.format(base_url=PLEX_URL, section_id=section_id) | |
r = requests.put(url, headers=headers, params=params) | |
if __name__ == '__main__': | |
parser = argparse.ArgumentParser() | |
parser.add_argument('--title', required=True) | |
parser.add_argument('--section_id', required=True) | |
parser.add_argument('--media_type', required=True) | |
parser.add_argument('--rating_key', required=True) | |
parser.add_argument('--parent_rating_key', required=True) | |
parser.add_argument('--grandparent_rating_key', required=True) | |
parser.add_argument('--label', required=True) | |
opts = parser.parse_args() | |
if opts.media_type not in MEDIA_TYPES_PARENT_VALUES: | |
print("Cannot add label to '{opts.title}': Invalid media type '{opts.media_type}'".format(opts=opts)) | |
else: | |
media_type_value = MEDIA_TYPES_PARENT_VALUES[opts.media_type] | |
rating_key = '' | |
if opts.media_type in ('movie', 'show', 'album'): | |
rating_key = opts.rating_key | |
elif opts.media_type in ('season', 'track'): | |
rating_key = opts.parent_rating_key | |
elif opts.media_type in ('episode'): | |
rating_key = opts.grandparent_rating_key | |
if rating_key and rating_key.isdigit(): | |
add_label(media_type_value, int(rating_key), opts.section_id, opts.label) | |
print("The label '{opts.label}' was added to '{opts.title}' ({rating_key}).".format(opts=opts, rating_key=rating_key)) | |
else: | |
print("Cannot add label to '{opts.title}': Invalid rating key '{rating_key}'".format(opts=opts, rating_key=rating_key)) |
can't figured out, why it's not working with series
accidentally I make a notification without condition (file+contains with blank) and the script runs well and write the tag to the series, then I modified the notify like the working with movies (file+contains+animation) then nothing happens, log says there is no animation in the file (and there is, and in xml wiew about an episode i can see there is)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
ah, I understand what you mean, before the script I added manually the label, after the script is added automatically in 5 minutes :) that's good for me :)