feat(jellyfin+emby): support marking item as partially watched

- this feature uses the new endpoint introduced with 24cbd64
This commit is contained in:
awakenedhaggis
2024-05-26 02:01:51 -06:00
parent 2b871c58ed
commit 0fa2a698ac

View File

@@ -127,7 +127,9 @@ class JellyfinEmby:
self.session = requests.Session() self.session = requests.Session()
self.users = self.get_users() self.users = self.get_users()
def query(self, query, query_type, identifiers=None): def query(
self, query, query_type, identifiers=None, json=None
):
try: try:
results = None results = None
@@ -135,24 +137,31 @@ class JellyfinEmby:
response = self.session.get( response = self.session.get(
self.baseurl + query, headers=self.headers, timeout=self.timeout self.baseurl + query, headers=self.headers, timeout=self.timeout
) )
if response.status_code != 200: if response.status_code not in [200, 204]:
raise Exception( raise Exception(
f"Query failed with status {response.status_code} {response.reason}" f"Query failed with status {response.status_code} {response.reason}"
) )
results = response.json() if response.status_code == 204:
results = None
else:
results = response.json()
elif query_type == "post": elif query_type == "post":
response = self.session.post( response = self.session.post(
self.baseurl + query, headers=self.headers, timeout=self.timeout self.baseurl + query, headers=self.headers, json=json, timeout=self.timeout
) )
if response.status_code != 200: if response.status_code not in [200, 204]:
raise Exception( raise Exception(
f"Query failed with status {response.status_code} {response.reason}" f"Query failed with status {response.status_code} {response.reason}"
) )
results = response.json() if response.status_code == 204:
results = None
else:
results = response.json()
if not isinstance(results, list) and not isinstance(results, dict): if results is not None:
raise Exception("Query result is not of type list or dict") if not isinstance(results, list) and not isinstance(results, dict):
raise Exception("Query result is not of type list or dict")
# append identifiers to results # append identifiers to results
if identifiers: if identifiers:
@@ -612,22 +621,27 @@ class JellyfinEmby:
jellyfin_video.get("Name"), jellyfin_video.get("Name"),
) )
else: else:
# TODO add support for partially watched movies
msg = f"{self.server_type}: {jellyfin_video.get('Name')} as partially watched for {floor(movie_status['time'] / 60_000)} minutes for {user_name} in {library}" msg = f"{self.server_type}: {jellyfin_video.get('Name')} as partially watched for {floor(movie_status['time'] / 60_000)} minutes for {user_name} in {library}"
"""
if not dryrun: if not dryrun:
pass logger(msg, 5)
# logger(msg, 5) playback_position_payload = {
"PlaybackPositionTicks": movie_status['time'] * 10_000,
}
self.query(
f"/Users/{user_id}/Items/{jellyfin_video_id}/UserData",
"post",
json=playback_position_payload
)
else: else:
pass logger(msg, 6)
# logger(msg, 6)
log_marked( log_marked(
user_name, user_name,
library, library,
jellyfin_video.get("Name"), jellyfin_video.get("Name"),
duration=floor(movie_status["time"] / 60_000), duration=floor(movie_status["time"] / 60_000),
)""" )
else: else:
logger( logger(
f"{self.server_type}: Skipping movie {jellyfin_video.get('Name')} as it is not in mark list for {user_name}", f"{self.server_type}: Skipping movie {jellyfin_video.get('Name')} as it is not in mark list for {user_name}",
@@ -737,18 +751,23 @@ class JellyfinEmby:
jellyfin_episode.get("Name"), jellyfin_episode.get("Name"),
) )
else: else:
# TODO add support for partially watched episodes
msg = ( msg = (
f"{self.server_type}: {jellyfin_episode['SeriesName']} {jellyfin_episode['SeasonName']} Episode {jellyfin_episode.get('IndexNumber')} {jellyfin_episode.get('Name')}" f"{self.server_type}: {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}" + f" as partially watched for {floor(episode_status['time'] / 60_000)} minutes for {user_name} in {library}"
) )
"""
if not dryrun: if not dryrun:
pass logger(msg, 5)
# logger(f"Marked {msg}", 0) playback_position_payload = {
"PlaybackPositionTicks": episode_status['time'] * 10_000,
}
self.query(
f"/Users/{user_id}/Items/{jellyfin_episode_id}/UserData",
"post",
json=playback_position_payload
)
else: else:
pass logger(msg, 6)
# logger(f"Dryrun {msg}", 0)
log_marked( log_marked(
user_name, user_name,
@@ -756,7 +775,7 @@ class JellyfinEmby:
jellyfin_episode.get("SeriesName"), jellyfin_episode.get("SeriesName"),
jellyfin_episode.get('Name'), jellyfin_episode.get('Name'),
duration=floor(episode_status["time"] / 60_000), duration=floor(episode_status["time"] / 60_000),
)""" )
else: else:
logger( logger(
f"{self.server_type}: Skipping episode {jellyfin_episode.get('Name')} as it is not in mark list for {user_name}", f"{self.server_type}: Skipping episode {jellyfin_episode.get('Name')} as it is not in mark list for {user_name}",