Last active
November 2, 2018 12:15
-
-
Save rustymyers/cfa215bfb7a3caefccc9c6b3ffd18210 to your computer and use it in GitHub Desktop.
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/python | |
#-------------------------------------------------------------------------------------------------- | |
#-- Series Tag Updater for Sonarr | |
#-------------------------------------------------------------------------------------------------- | |
# Program : SonarrTagarr | |
# To Complie : n/a | |
# | |
# Purpose : Add tags to Sonarr series. Tags are retreived from Sonarr. | |
# Say Y to add a tag. N to skip a tag. N for all tags will remove all tags. | |
# | |
# Called By : | |
# Calls : | |
# | |
# Author : Rusty Myers <[email protected]> | |
# Based Upon : | |
# | |
# Note : | |
# | |
# Revisions : | |
# 2017-05-03 <rusty> Initial Version | |
# 2018-02-12 <rusty> Updating to combine new tags with existing tags, | |
# Check each tag on series to determine if it needs an update, | |
# Adding ability to update profiles. | |
# | |
# Version : 1.1 | |
#-------------------------------------------------------------------------------------------------- | |
import urllib2 | |
import json | |
import requests | |
# Function to return json of all Seriess | |
def getData(SonarrHost): | |
response = requests.get(SonarrHost) | |
json = response.json() | |
return json | |
# function to put updated data | |
def putData(SonarrHost, seriesData): | |
r = requests.put(SonarrHost, json=seriesData) | |
return r | |
# Variables | |
# Sonarr API Key, get it in Settings->General->Security of Sonarr pages | |
apiKey = "APIKEY" | |
# Sonarr Host Name: Add reverse proxy or direct IP:port, no trailing slash | |
hostName = "https://hostname:8989" | |
# Get All Tags | |
allTagsJSON = getData(hostName + "/api/tag?apikey=" + apiKey) | |
# Get all Profiles | |
allProfilesJSON = getData(hostName + "/api/profile?apikey=" + apiKey) | |
# Set a profile | |
profileint = "" | |
profileNames = {} | |
# Print Profiles | |
for profile in allProfilesJSON: | |
print "Which profile should we add to the series?" | |
print "ID: {1} Name: {0}".format(profile["name"], profile["id"]) | |
# Add tag to lookup by it's id | |
profileNames[profile["id"]] = profile["name"] | |
# Ask if we should add it to all movies? | |
addProfile = raw_input('Which profile to all series? [1-{0}] : '.format(len(profileNames))) | |
# Add the profiles to our list of tag numbers | |
profileint = int(addProfile) | |
addProfile = raw_input('Are you sure you want to set all movies to profile \"{0}\"? [y/n] : '.format(profileNames[profileint])) | |
# If the answer not starts with any case Y | |
if not addProfile.lower().startswith("y"): | |
print "Exiting" | |
else: | |
print "Adding profile {0}...".format(profileNames[profileint]) | |
# Make list of tags to add | |
tags = [] | |
# Make a tag lookup for later | |
tagNames = {} | |
# For each tag | |
for tag in allTagsJSON: | |
# Add tag to lookup by it's id | |
tagNames[tag['id']] = tag['label'] | |
# Ask if we should add it to all series? | |
addTag = raw_input('Add Tag \"{0}\" to all series? [y/n] : '.format(tag['label'])) | |
# If the answer starts with any case Y | |
if addTag.lower().startswith("y"): | |
# Add the tag to our list of tag numbers | |
tags.append(int(tag['id'])) | |
# Ask if we should contiunue? | |
addTag = raw_input("Add Tag(s) '{0}' to all series? [y/n] : ".format(", ".join(tagNames[int(p)] for p in tags))) | |
# If the answer starts with any case Y | |
if addTag.lower().startswith("y"): | |
# Get All series | |
SonarrHost = hostName + "/api/series?apikey=" + apiKey | |
allSeriesJSON = getData(SonarrHost) | |
# for each series | |
for series in allSeriesJSON: | |
# get movie ID for updating data with putData | |
seriesID = series['id'] | |
# Set tagMissing to false and check each tag | |
dataMissing = False | |
# For each tag we want to add | |
for tag in tags: | |
# If that tag does not exist currenlty | |
if tag not in series['tags']: | |
# Set boolean to update tags | |
dataMissing = True | |
if series['qualityProfileId'] != profileint or series['profileId'] != profileint: | |
dataMissing = True | |
if not dataMissing: | |
# Print series that have the correct tags | |
print "Skipping {0} with existing tags: {1} ".format(series['title'].encode('utf-8'), ", ".join(tagNames[int(p)] for p in series['tags'])) | |
else: | |
# Print name to statisfy user something is happening | |
print "Adding '{0}' to Series: {1}".format(", ".join(tagNames[int(p)] for p in tags), series['title'].encode('utf-8')) | |
# Add tag | |
series['tags'] = tags | |
series['qualityProfileId'] = profileint | |
series['profileId'] = profileint | |
# Update SonarrHost to include series ID | |
SonarrHost = hostName + "/api/series/" + str(seriesID) + "?apikey=" + apiKey | |
# Put series back to Sonarr | |
updateSeries = putData(SonarrHost, series) | |
# If the update worked, just tell 'em that | |
if updateSeries.status_code == 202: | |
print "Sucessfully updated \"{0}\"".format(series['title'].encode('utf-8')) | |
else: | |
# If the update didn't work, let 'em know | |
print "Failed: Series \"{0}\" returned response code: {1}".format(series['title'].encode('utf-8'), updateSeries.status_code) | |
print updateSeries.text | |
exit(0) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment