Jellyfin: Skip partial on version lower than 10.9
parent
74f29d44b3
commit
d30e03b702
BIN
requirements.txt
BIN
requirements.txt
Binary file not shown.
|
|
@ -4,6 +4,7 @@ import traceback, os
|
||||||
from math import floor
|
from math import floor
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
import requests
|
import requests
|
||||||
|
from packaging import version
|
||||||
|
|
||||||
from src.functions import (
|
from src.functions import (
|
||||||
logger,
|
logger,
|
||||||
|
|
@ -25,7 +26,6 @@ load_dotenv(override=True)
|
||||||
generate_guids = str_to_bool(os.getenv("GENERATE_GUIDS", "True"))
|
generate_guids = str_to_bool(os.getenv("GENERATE_GUIDS", "True"))
|
||||||
generate_locations = str_to_bool(os.getenv("GENERATE_LOCATIONS", "True"))
|
generate_locations = str_to_bool(os.getenv("GENERATE_LOCATIONS", "True"))
|
||||||
|
|
||||||
|
|
||||||
def get_guids(server_type, item):
|
def get_guids(server_type, item):
|
||||||
if item.get("Name"):
|
if item.get("Name"):
|
||||||
guids = {"title": item.get("Name")}
|
guids = {"title": item.get("Name")}
|
||||||
|
|
@ -125,6 +125,7 @@ class JellyfinEmby:
|
||||||
raise Exception(f"{self.server_type} token not set")
|
raise Exception(f"{self.server_type} token not set")
|
||||||
|
|
||||||
self.session = requests.Session()
|
self.session = requests.Session()
|
||||||
|
self.version = version.parse(self.info(version=True))
|
||||||
self.users = self.get_users()
|
self.users = self.get_users()
|
||||||
|
|
||||||
def query(self, query, query_type, identifiers=None, json=None):
|
def query(self, query, query_type, identifiers=None, json=None):
|
||||||
|
|
@ -177,13 +178,17 @@ class JellyfinEmby:
|
||||||
)
|
)
|
||||||
raise Exception(e)
|
raise Exception(e)
|
||||||
|
|
||||||
def info(self) -> str:
|
def info(self, version=False) -> str:
|
||||||
try:
|
try:
|
||||||
query_string = "/System/Info/Public"
|
query_string = "/System/Info/Public"
|
||||||
|
|
||||||
response = self.query(query_string, "get")
|
response = self.query(query_string, "get")
|
||||||
|
|
||||||
if response:
|
if response:
|
||||||
|
# Return version only if requested
|
||||||
|
if version:
|
||||||
|
return response['Version']
|
||||||
|
|
||||||
return f"{self.server_type} {response['ServerName']}: {response['Version']}"
|
return f"{self.server_type} {response['ServerName']}: {response['Version']}"
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
@ -561,28 +566,32 @@ class JellyfinEmby:
|
||||||
jellyfin_video.get("Name"),
|
jellyfin_video.get("Name"),
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
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}"
|
# Handle partially watched movies not supported in jellyfin < 10.9.0
|
||||||
|
if self.server_type == "Jellyfin" and self.version < version.parse("10.9.0"):
|
||||||
if not dryrun:
|
logger(f"{self.server_type}: Skipping movie {jellyfin_video.get('Name')} as partially watched not supported in Jellyfin < 10.9.0", 4)
|
||||||
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:
|
||||||
logger(msg, 6)
|
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}"
|
||||||
|
|
||||||
log_marked(
|
if not dryrun:
|
||||||
user_name,
|
logger(msg, 5)
|
||||||
library,
|
playback_position_payload = {
|
||||||
jellyfin_video.get("Name"),
|
"PlaybackPositionTicks": movie_status["time"]
|
||||||
duration=floor(movie_status["time"] / 60_000),
|
* 10_000,
|
||||||
)
|
}
|
||||||
|
self.query(
|
||||||
|
f"/Users/{user_id}/Items/{jellyfin_video_id}/UserData",
|
||||||
|
"post",
|
||||||
|
json=playback_position_payload,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
logger(msg, 6)
|
||||||
|
|
||||||
|
log_marked(
|
||||||
|
user_name,
|
||||||
|
library,
|
||||||
|
jellyfin_video.get("Name"),
|
||||||
|
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}",
|
||||||
|
|
@ -690,34 +699,38 @@ class JellyfinEmby:
|
||||||
jellyfin_episode.get("Name"),
|
jellyfin_episode.get("Name"),
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
msg = (
|
# Handle partially watched episodes not supported in jellyfin < 10.9.0
|
||||||
f"{self.server_type}: {jellyfin_episode['SeriesName']} {jellyfin_episode['SeasonName']} Episode {jellyfin_episode.get('IndexNumber')} {jellyfin_episode.get('Name')}"
|
if self.server_type == "Jellyfin" and self.version < version.parse("10.9.0"):
|
||||||
+ f" as partially watched for {floor(episode_status['time'] / 60_000)} minutes for {user_name} in {library}"
|
logger(f"{self.server_type}: Skipping episode {jellyfin_episode.get('Name')} as partially watched not supported in Jellyfin < 10.9.0", 4)
|
||||||
)
|
|
||||||
|
|
||||||
if not dryrun:
|
|
||||||
logger(msg, 5)
|
|
||||||
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:
|
||||||
logger(msg, 6)
|
msg = (
|
||||||
|
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}"
|
||||||
|
)
|
||||||
|
|
||||||
log_marked(
|
if not dryrun:
|
||||||
user_name,
|
logger(msg, 5)
|
||||||
library,
|
playback_position_payload = {
|
||||||
jellyfin_episode.get("SeriesName"),
|
"PlaybackPositionTicks": episode_status[
|
||||||
jellyfin_episode.get("Name"),
|
"time"
|
||||||
duration=floor(episode_status["time"] / 60_000),
|
]
|
||||||
)
|
* 10_000,
|
||||||
|
}
|
||||||
|
self.query(
|
||||||
|
f"/Users/{user_id}/Items/{jellyfin_episode_id}/UserData",
|
||||||
|
"post",
|
||||||
|
json=playback_position_payload,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
logger(msg, 6)
|
||||||
|
|
||||||
|
log_marked(
|
||||||
|
user_name,
|
||||||
|
library,
|
||||||
|
jellyfin_episode.get("SeriesName"),
|
||||||
|
jellyfin_episode.get("Name"),
|
||||||
|
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}",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue