Add mark list support
parent
76ac264b25
commit
df13cef760
|
|
@ -18,9 +18,15 @@ SLEEP_DURATION = "3600"
|
|||
## Log file where all output will be written to
|
||||
LOGFILE = "log.log"
|
||||
|
||||
## Mark file where all shows/movies that have been marked as played will be written to
|
||||
MARK_FILE = "mark.log"
|
||||
|
||||
## Timeout for requests for jellyfin
|
||||
REQUEST_TIMEOUT = 300
|
||||
|
||||
## Max threads for processing
|
||||
MAX_THREADS = 32
|
||||
|
||||
## Map usernames between servers in the event that they are different, order does not matter
|
||||
## Comma separated for multiple options
|
||||
#USER_MAPPING = { "testuser2": "testuser3", "testuser1":"testuser4" }
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ from dotenv import load_dotenv
|
|||
load_dotenv(override=True)
|
||||
|
||||
logfile = os.getenv("LOGFILE", "log.log")
|
||||
markfile = os.getenv("MARK_FILE", "mark.log")
|
||||
|
||||
|
||||
def logger(message: str, log_type=0):
|
||||
|
|
@ -31,6 +32,24 @@ def logger(message: str, log_type=0):
|
|||
file.write(output + "\n")
|
||||
|
||||
|
||||
def log_marked(
|
||||
username: str, library: str, movie_show: str, episode: str = None, duration=None
|
||||
):
|
||||
if markfile is None:
|
||||
return
|
||||
|
||||
output = f"{username}/{library}/{movie_show}"
|
||||
|
||||
if episode:
|
||||
output += f"/{episode}"
|
||||
|
||||
if duration:
|
||||
output += f"/{duration}"
|
||||
|
||||
file = open(f"{markfile}", "a", encoding="utf-8")
|
||||
file.write(output + "\n")
|
||||
|
||||
|
||||
# Reimplementation of distutils.util.strtobool due to it being deprecated
|
||||
# Source: https://github.com/PostHog/posthog/blob/01e184c29d2c10c43166f1d40a334abbc3f99d8a/posthog/utils.py#L668
|
||||
def str_to_bool(value: any) -> bool:
|
||||
|
|
|
|||
|
|
@ -2,7 +2,12 @@ import asyncio, aiohttp, traceback, os
|
|||
from math import floor
|
||||
from dotenv import load_dotenv
|
||||
|
||||
from src.functions import logger, search_mapping, contains_nested
|
||||
from src.functions import (
|
||||
logger,
|
||||
search_mapping,
|
||||
contains_nested,
|
||||
log_marked,
|
||||
)
|
||||
from src.library import (
|
||||
check_skip_logic,
|
||||
generate_library_guids_dict,
|
||||
|
|
@ -642,6 +647,12 @@ class Jellyfin:
|
|||
)
|
||||
else:
|
||||
logger(f"Dryrun {msg}", 0)
|
||||
|
||||
log_marked(
|
||||
user_name,
|
||||
library,
|
||||
jellyfin_video.get("Name"),
|
||||
)
|
||||
else:
|
||||
# TODO add support for partially watched movies
|
||||
msg = f"{jellyfin_video.get('Name')} as partially watched for {floor(movie_status['time'] / 60_000)} minutes for {user_name} in {library} for Jellyfin"
|
||||
|
|
@ -651,6 +662,13 @@ class Jellyfin:
|
|||
else:
|
||||
pass
|
||||
# logger(f"Dryrun {msg}", 0)
|
||||
|
||||
log_marked(
|
||||
user_name,
|
||||
library,
|
||||
jellyfin_video.get("Name"),
|
||||
duration=floor(movie_status["time"] / 60_000),
|
||||
)
|
||||
else:
|
||||
logger(
|
||||
f"Jellyfin: Skipping movie {jellyfin_video.get('Name')} as it is not in mark list for {user_name}",
|
||||
|
|
@ -811,18 +829,34 @@ class Jellyfin:
|
|||
)
|
||||
else:
|
||||
logger(f"Dryrun {msg}", 0)
|
||||
|
||||
log_marked(
|
||||
user_name,
|
||||
library,
|
||||
jellyfin_episode.get("SeriesName"),
|
||||
jellyfin_episode.get("Name"),
|
||||
)
|
||||
else:
|
||||
# TODO add support for partially watched episodes
|
||||
msg = (
|
||||
f"{jellyfin_episode['SeriesName']} {jellyfin_episode['SeasonName']} Episode {jellyfin_episode.get('IndexNumber')} {jellyfin_episode.get('Name')}"
|
||||
+ f" as partially watched for {floor(episode_status['time'] / 60_000)} minutes for {user_name} in {library} for Jellyfin"
|
||||
)
|
||||
"""
|
||||
if not dryrun:
|
||||
pass
|
||||
# logger(f"Marked {msg}", 0)
|
||||
else:
|
||||
pass
|
||||
# logger(f"Dryrun {msg}", 0)
|
||||
|
||||
log_marked(
|
||||
user_name,
|
||||
library,
|
||||
jellyfin_episode.get("SeriesName"),
|
||||
jellyfin_episode.get('Name'),
|
||||
duration=floor(episode_status["time"] / 60_000),
|
||||
)"""
|
||||
else:
|
||||
logger(
|
||||
f"Jellyfin: Skipping episode {jellyfin_episode.get('Name')} as it is not in mark list for {user_name}",
|
||||
|
|
|
|||
25
src/plex.py
25
src/plex.py
|
|
@ -10,6 +10,7 @@ from src.functions import (
|
|||
search_mapping,
|
||||
future_thread_executor,
|
||||
contains_nested,
|
||||
log_marked,
|
||||
)
|
||||
from src.library import (
|
||||
check_skip_logic,
|
||||
|
|
@ -301,6 +302,8 @@ def update_user_watched(user, user_plex, library, videos, dryrun):
|
|||
movies_search.markWatched()
|
||||
else:
|
||||
logger(f"Dryrun {msg}", 0)
|
||||
|
||||
log_marked(user.title, library, movies_search.title, None, None)
|
||||
elif video_status["time"] > 60_000:
|
||||
msg = f"{movies_search.title} as partially watched for {floor(video_status['time'] / 60_000)} minutes for {user.title} in {library} for Plex"
|
||||
if not dryrun:
|
||||
|
|
@ -308,6 +311,13 @@ def update_user_watched(user, user_plex, library, videos, dryrun):
|
|||
movies_search.updateProgress(video_status["time"])
|
||||
else:
|
||||
logger(f"Dryrun {msg}", 0)
|
||||
|
||||
log_marked(
|
||||
user.title,
|
||||
library,
|
||||
movies_search.title,
|
||||
duration=video_status["time"],
|
||||
)
|
||||
else:
|
||||
logger(
|
||||
f"Plex: Skipping movie {movies_search.title} as it is not in mark list for {user.title}",
|
||||
|
|
@ -332,6 +342,13 @@ def update_user_watched(user, user_plex, library, videos, dryrun):
|
|||
episode_search.markWatched()
|
||||
else:
|
||||
logger(f"Dryrun {msg}", 0)
|
||||
|
||||
log_marked(
|
||||
user.title,
|
||||
library,
|
||||
show_search.title,
|
||||
episode_search.title,
|
||||
)
|
||||
else:
|
||||
msg = f"{show_search.title} {episode_search.title} as partially watched for {floor(video_status['time'] / 60_000)} minutes for {user.title} in {library} for Plex"
|
||||
if not dryrun:
|
||||
|
|
@ -339,6 +356,14 @@ def update_user_watched(user, user_plex, library, videos, dryrun):
|
|||
episode_search.updateProgress(video_status["time"])
|
||||
else:
|
||||
logger(f"Dryrun {msg}", 0)
|
||||
|
||||
log_marked(
|
||||
user.title,
|
||||
library,
|
||||
show_search.title,
|
||||
episode_search.title,
|
||||
video_status["time"],
|
||||
)
|
||||
else:
|
||||
logger(
|
||||
f"Plex: Skipping episode {episode_search.title} as it is not in mark list for {user.title}",
|
||||
|
|
|
|||
Loading…
Reference in New Issue