You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
3.2 KiB
63 lines
3.2 KiB
import logging, requests
|
|
from modules import util
|
|
from modules.util import Failed
|
|
from retrying import retry
|
|
|
|
logger = logging.getLogger("Plex Meta Manager")
|
|
|
|
class TautulliAPI:
|
|
def __init__(self, params):
|
|
try:
|
|
response = requests.get("{}/api/v2?apikey={}&cmd=get_library_names".format(params["url"], params["apikey"])).json()
|
|
except Exception as e:
|
|
util.print_stacktrace()
|
|
raise Failed("Tautulli Error: Invalid url")
|
|
if response["response"]["result"] != "success":
|
|
raise Failed("Tautulli Error: {}".format(response["response"]["message"]))
|
|
self.url = params["url"]
|
|
self.apikey = params["apikey"]
|
|
|
|
def get_popular(self, library, time_range=30, stats_count=20, stats_count_buffer=20, status_message=True):
|
|
return self.get_items(library, time_range=time_range, stats_count=stats_count, list_type="popular", stats_count_buffer=stats_count_buffer, status_message=status_message)
|
|
|
|
def get_top(self, library, time_range=30, stats_count=20, stats_count_buffer=20, status_message=True):
|
|
return self.get_items(library, time_range=time_range, stats_count=stats_count, list_type="top", stats_count_buffer=stats_count_buffer, status_message=status_message)
|
|
|
|
def get_items(self, library, time_range=30, stats_count=20, list_type="popular", stats_count_buffer=20, status_message=True):
|
|
if status_message:
|
|
logger.info("Processing Tautulli Most {}: {} {}".format("Popular" if list_type == "popular" else "Watched", stats_count, "Movies" if library.is_movie else "Shows"))
|
|
response = self.send_request("{}/api/v2?apikey={}&cmd=get_home_stats&time_range={}&stats_count={}".format(self.url, self.apikey, time_range, int(stats_count) + int(stats_count_buffer)))
|
|
stat_id = "{}_{}".format("popular" if list_type == "popular" else "top", "movies" if library.is_movie else "tv")
|
|
|
|
items = None
|
|
for entry in response["response"]["data"]:
|
|
if entry["stat_id"] == stat_id:
|
|
items = entry["rows"]
|
|
break
|
|
if items is None:
|
|
raise Failed("Tautulli Error: No Items found in the response")
|
|
|
|
section_id = self.get_section_id(library.name)
|
|
rating_keys = []
|
|
count = 0
|
|
for item in items:
|
|
if item["section_id"] == section_id and count < int(stats_count):
|
|
rating_keys.append(item["rating_key"])
|
|
count += 1
|
|
return rating_keys
|
|
|
|
def get_section_id(self, library_name):
|
|
response = self.send_request("{}/api/v2?apikey={}&cmd=get_library_names".format(self.url, self.apikey))
|
|
section_id = None
|
|
for entry in response["response"]["data"]:
|
|
if entry["section_name"] == library_name:
|
|
section_id = entry["section_id"]
|
|
break
|
|
if section_id: return section_id
|
|
else: raise Failed("Tautulli Error: No Library named {} in the response".format(library_name))
|
|
|
|
@retry(stop_max_attempt_number=6, wait_fixed=10000)
|
|
def send_request(self, url):
|
|
logger.debug("Tautulli URL: {}".format(url.replace(self.apikey, "################################")))
|
|
return requests.get(url).json()
|