add show deletion
This commit is contained in:
parent
2f123b16a4
commit
2c3bb5811f
|
|
@ -4,7 +4,7 @@ API_KEY = e18e33df8f7sdfae92d3a2344f2f60
|
||||||
|
|
||||||
[MEDIA_FILTER]
|
[MEDIA_FILTER]
|
||||||
; Section_id de la librairie film à nettoyer
|
; Section_id de la librairie film à nettoyer
|
||||||
film_section_ids = 1
|
film_section_ids = [1,2]
|
||||||
; nb de mois avant suppression pour un film jamais regardé
|
; nb de mois avant suppression pour un film jamais regardé
|
||||||
deadline_never_watched = 60
|
deadline_never_watched = 60
|
||||||
; nb de mois avant suppression depuis le dernier visionage
|
; nb de mois avant suppression depuis le dernier visionage
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import traceback
|
||||||
import argparse
|
import argparse
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
import ast
|
||||||
import sys
|
import sys
|
||||||
import requests
|
import requests
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
@ -19,10 +20,10 @@ class ApplicationError(Exception):
|
||||||
|
|
||||||
SERVER_URL = ""
|
SERVER_URL = ""
|
||||||
API_KEY = ""
|
API_KEY = ""
|
||||||
FILM_SECTION_IDS = ""
|
FILM_SECTION_IDS = []
|
||||||
DEADLINE_NEVER_WATCHED = ""
|
DEADLINE_NEVER_WATCHED = ""
|
||||||
DEADLINE_LAST_WATCHED = ""
|
DEADLINE_LAST_WATCHED = ""
|
||||||
FILES_TO_KEEP = ""
|
FILES_TO_KEEP = []
|
||||||
|
|
||||||
# Retrieve the list of records that does not follow the deadline policies from tautulli
|
# Retrieve the list of records that does not follow the deadline policies from tautulli
|
||||||
def get_unwatched_rating_keys(sectionId):
|
def get_unwatched_rating_keys(sectionId):
|
||||||
|
|
@ -84,8 +85,9 @@ def get_unwatched_rating_keys(sectionId):
|
||||||
|
|
||||||
return unwatched
|
return unwatched
|
||||||
|
|
||||||
# Get the file path of the media in the filesystem
|
# Returns the path list of all the files composing the media
|
||||||
def get_media_path(rating_key):
|
def get_media_paths(rating_key):
|
||||||
|
# Get the metadata of the media
|
||||||
payload = {'apikey': API_KEY, 'cmd': 'get_metadata', 'rating_key': rating_key}
|
payload = {'apikey': API_KEY, 'cmd': 'get_metadata', 'rating_key': rating_key}
|
||||||
request = requests.get(SERVER_URL+"api/v2", params=payload)
|
request = requests.get(SERVER_URL+"api/v2", params=payload)
|
||||||
response = json.loads(request.content)
|
response = json.loads(request.content)
|
||||||
|
|
@ -94,10 +96,28 @@ def get_media_path(rating_key):
|
||||||
raise RequestError("Could not request media path for {} : {}".format(rating_key, response["response"]['message']))
|
raise RequestError("Could not request media path for {} : {}".format(rating_key, response["response"]['message']))
|
||||||
|
|
||||||
match response["response"]["data"]["media_type"]:
|
match response["response"]["data"]["media_type"]:
|
||||||
case "movie":
|
case "movie" | "episode":
|
||||||
return response["response"]["data"]["media_info"][0]["parts"][0]["file"]
|
# If the media is a video file we return it as a list of single element
|
||||||
case "show":
|
return [response["response"]["data"]["media_info"][0]["parts"][0]["file"]]
|
||||||
raise ApplicationError("media path for shows are not implemented yet") # TODO: handle case for shows
|
|
||||||
|
case "show" | "season":
|
||||||
|
# If the media is a group of media we get the path of all its components
|
||||||
|
# Getting the list of child
|
||||||
|
payload = {'apikey': API_KEY, 'cmd': 'get_children_metadata', 'rating_key': rating_key}
|
||||||
|
request = requests.get(SERVER_URL+"api/v2", params=payload)
|
||||||
|
response = json.loads(request.content)
|
||||||
|
|
||||||
|
if response["response"]['result'] == 'error':
|
||||||
|
raise RequestError("Could not request media path for {} : {}".format(rating_key, response["response"]['message']))
|
||||||
|
|
||||||
|
# Get the path of all childs recursively
|
||||||
|
paths = []
|
||||||
|
for media in response["response"]["data"]["children_list"]:
|
||||||
|
if media["rating_key"] == "":
|
||||||
|
continue
|
||||||
|
paths.extend(get_media_paths(media["rating_key"]))
|
||||||
|
return paths
|
||||||
|
|
||||||
case _:
|
case _:
|
||||||
raise ApplicationError("Unkown media type for rating key {}: {} ".format(rating_key, response["response"]["data"]["media_type"]))
|
raise ApplicationError("Unkown media type for rating key {}: {} ".format(rating_key, response["response"]["data"]["media_type"]))
|
||||||
|
|
||||||
|
|
@ -107,7 +127,8 @@ def get_files_to_remove(unwatched):
|
||||||
logger.info("Getting path of unwatched medias")
|
logger.info("Getting path of unwatched medias")
|
||||||
pathToRemove = []
|
pathToRemove = []
|
||||||
for media in unwatched:
|
for media in unwatched:
|
||||||
path = get_media_path(media)
|
paths = get_media_paths(media)
|
||||||
|
for path in paths:
|
||||||
if path not in FILES_TO_KEEP:
|
if path not in FILES_TO_KEEP:
|
||||||
pathToRemove.append(path)
|
pathToRemove.append(path)
|
||||||
return pathToRemove
|
return pathToRemove
|
||||||
|
|
@ -115,7 +136,11 @@ def get_files_to_remove(unwatched):
|
||||||
# writes the list of files selected for deletion in a file
|
# writes the list of files selected for deletion in a file
|
||||||
def get_and_store_files_to_remove():
|
def get_and_store_files_to_remove():
|
||||||
logger.info("Getting list of rating id for unwatched medias")
|
logger.info("Getting list of rating id for unwatched medias")
|
||||||
unwatched = get_unwatched_rating_keys(FILM_SECTION_IDS)
|
unwatched = []
|
||||||
|
for sectionId in FILM_SECTION_IDS:
|
||||||
|
logger.debug("Getting list for sectionID={}".format(sectionId))
|
||||||
|
unwatched.extend(get_unwatched_rating_keys(sectionId))
|
||||||
|
|
||||||
logger.debug("list of rating_key of unwatched medias: {}".format(unwatched))
|
logger.debug("list of rating_key of unwatched medias: {}".format(unwatched))
|
||||||
|
|
||||||
pathToRemove = get_files_to_remove(unwatched)
|
pathToRemove = get_files_to_remove(unwatched)
|
||||||
|
|
@ -191,12 +216,12 @@ API_KEY = serverParam["api_key"]
|
||||||
|
|
||||||
# -- Read MEDIA_FILTER section --
|
# -- Read MEDIA_FILTER section --
|
||||||
mediaParam = config_obj["MEDIA_FILTER"]
|
mediaParam = config_obj["MEDIA_FILTER"]
|
||||||
FILM_SECTION_IDS = int(mediaParam["film_section_ids"])
|
FILM_SECTION_IDS = ast.literal_eval(mediaParam["film_section_ids"])
|
||||||
DEADLINE_NEVER_WATCHED = int(mediaParam["deadline_never_watched"])
|
DEADLINE_NEVER_WATCHED = int(mediaParam["deadline_never_watched"])
|
||||||
DEADLINE_LAST_WATCHED = int(mediaParam["deadline_last_watched"])
|
DEADLINE_LAST_WATCHED = int(mediaParam["deadline_last_watched"])
|
||||||
FILES_TO_KEEP = mediaParam["files_to_ignore"]
|
FILES_TO_KEEP = ast.literal_eval(mediaParam["files_to_ignore"])
|
||||||
|
|
||||||
logger.debug("Loaded config values: \n SERVER_URL: {}\n API_KEY: hidden FILM_SECTION_IDS: {}\n DEADLINE_NEVER_WATCHED: {}\n DEADLINE_LAST_WATCHED: {}\n FILES_TO_KEEP: {}".format(SERVER_URL, FILM_SECTION_IDS, DEADLINE_NEVER_WATCHED, DEADLINE_LAST_WATCHED, FILES_TO_KEEP))
|
logger.debug("Loaded config values: \n SERVER_URL: {}\n API_KEY: hidden\n FILM_SECTION_IDS: {}\n DEADLINE_NEVER_WATCHED: {}\n DEADLINE_LAST_WATCHED: {}\n FILES_TO_KEEP: {}".format(SERVER_URL, FILM_SECTION_IDS, DEADLINE_NEVER_WATCHED, DEADLINE_LAST_WATCHED, FILES_TO_KEEP))
|
||||||
|
|
||||||
|
|
||||||
### --- Start logic --- ###
|
### --- Start logic --- ###
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue