@@ -29,6 +29,11 @@ REQUEST_TIMEOUT = 300
|
|||||||
## by using the location only, useful when using same files on multiple servers
|
## by using the location only, useful when using same files on multiple servers
|
||||||
GENERATE_GUIDS = "True"
|
GENERATE_GUIDS = "True"
|
||||||
|
|
||||||
|
## Generate locations
|
||||||
|
## Generating locations is a slow process, so this is a way to speed up the process
|
||||||
|
## by using the guid only, useful when using different files on multiple servers
|
||||||
|
GENERATE_LOCATIONS = "True"
|
||||||
|
|
||||||
## Max threads for processing
|
## Max threads for processing
|
||||||
MAX_THREADS = 32
|
MAX_THREADS = 32
|
||||||
|
|
||||||
|
|||||||
87
src/plex.py
87
src/plex.py
@@ -28,6 +28,7 @@ from src.library import (
|
|||||||
load_dotenv(override=True)
|
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"))
|
||||||
|
|
||||||
|
|
||||||
# Bypass hostname validation for ssl. Taken from https://github.com/pkkid/python-plexapi/issues/143#issuecomment-775485186
|
# Bypass hostname validation for ssl. Taken from https://github.com/pkkid/python-plexapi/issues/143#issuecomment-775485186
|
||||||
@@ -55,7 +56,7 @@ def extract_guids_from_item(item: Union[Movie, Show, Episode]) -> Dict[str, str]
|
|||||||
|
|
||||||
if len(guids) == 0:
|
if len(guids) == 0:
|
||||||
logger(
|
logger(
|
||||||
f"Plex: Failed to get any guids for {item.title}, Using location only",
|
f"Plex: Failed to get any guids for {item.title}",
|
||||||
1,
|
1,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -65,7 +66,9 @@ def extract_guids_from_item(item: Union[Movie, Show, Episode]) -> Dict[str, str]
|
|||||||
def get_guids(item: Union[Movie, Episode], completed=True):
|
def get_guids(item: Union[Movie, Episode], completed=True):
|
||||||
return {
|
return {
|
||||||
"title": item.title,
|
"title": item.title,
|
||||||
"locations": tuple([location.split("/")[-1] for location in item.locations]),
|
"locations": tuple([location.split("/")[-1] for location in item.locations])
|
||||||
|
if generate_locations
|
||||||
|
else tuple(),
|
||||||
"status": {
|
"status": {
|
||||||
"completed": completed,
|
"completed": completed,
|
||||||
"time": item.viewOffset,
|
"time": item.viewOffset,
|
||||||
@@ -83,7 +86,9 @@ def get_user_library_watched_show(show, process_episodes, threads=None):
|
|||||||
"title": show.title,
|
"title": show.title,
|
||||||
"locations": tuple(
|
"locations": tuple(
|
||||||
[location.split("/")[-1] for location in show.locations]
|
[location.split("/")[-1] for location in show.locations]
|
||||||
),
|
)
|
||||||
|
if generate_locations
|
||||||
|
else tuple(),
|
||||||
}
|
}
|
||||||
| extract_guids_from_item(show)
|
| extract_guids_from_item(show)
|
||||||
).items() # Merge the metadata and guid dictionaries
|
).items() # Merge the metadata and guid dictionaries
|
||||||
@@ -190,28 +195,32 @@ def get_user_library_watched(user, user_plex, library):
|
|||||||
|
|
||||||
def find_video(plex_search, video_ids, videos=None):
|
def find_video(plex_search, video_ids, videos=None):
|
||||||
try:
|
try:
|
||||||
for location in plex_search.locations:
|
if not generate_guids and not generate_locations:
|
||||||
if (
|
|
||||||
contains_nested(location.split("/")[-1], video_ids["locations"])
|
|
||||||
is not None
|
|
||||||
):
|
|
||||||
episode_videos = []
|
|
||||||
if videos:
|
|
||||||
for show, seasons in videos.items():
|
|
||||||
show = {k: v for k, v in show}
|
|
||||||
if (
|
|
||||||
contains_nested(location.split("/")[-1], show["locations"])
|
|
||||||
is not None
|
|
||||||
):
|
|
||||||
for season in seasons.values():
|
|
||||||
for episode in season:
|
|
||||||
episode_videos.append(episode)
|
|
||||||
|
|
||||||
return True, episode_videos
|
|
||||||
|
|
||||||
if not generate_guids:
|
|
||||||
return False, []
|
return False, []
|
||||||
else:
|
|
||||||
|
if generate_locations:
|
||||||
|
for location in plex_search.locations:
|
||||||
|
if (
|
||||||
|
contains_nested(location.split("/")[-1], video_ids["locations"])
|
||||||
|
is not None
|
||||||
|
):
|
||||||
|
episode_videos = []
|
||||||
|
if videos:
|
||||||
|
for show, seasons in videos.items():
|
||||||
|
show = {k: v for k, v in show}
|
||||||
|
if (
|
||||||
|
contains_nested(
|
||||||
|
location.split("/")[-1], show["locations"]
|
||||||
|
)
|
||||||
|
is not None
|
||||||
|
):
|
||||||
|
for season in seasons.values():
|
||||||
|
for episode in season:
|
||||||
|
episode_videos.append(episode)
|
||||||
|
|
||||||
|
return True, episode_videos
|
||||||
|
|
||||||
|
if generate_guids:
|
||||||
for guid in plex_search.guids:
|
for guid in plex_search.guids:
|
||||||
guid_source, guid_id = guid.id.split("://")
|
guid_source, guid_id = guid.id.split("://")
|
||||||
|
|
||||||
@@ -239,21 +248,23 @@ def find_video(plex_search, video_ids, videos=None):
|
|||||||
|
|
||||||
def get_video_status(plex_search, video_ids, videos):
|
def get_video_status(plex_search, video_ids, videos):
|
||||||
try:
|
try:
|
||||||
for location in plex_search.locations:
|
if not generate_guids and not generate_locations:
|
||||||
if (
|
|
||||||
contains_nested(location.split("/")[-1], video_ids["locations"])
|
|
||||||
is not None
|
|
||||||
):
|
|
||||||
for video in videos:
|
|
||||||
if (
|
|
||||||
contains_nested(location.split("/")[-1], video["locations"])
|
|
||||||
is not None
|
|
||||||
):
|
|
||||||
return video["status"]
|
|
||||||
|
|
||||||
if not generate_guids:
|
|
||||||
return None
|
return None
|
||||||
else:
|
|
||||||
|
if generate_locations:
|
||||||
|
for location in plex_search.locations:
|
||||||
|
if (
|
||||||
|
contains_nested(location.split("/")[-1], video_ids["locations"])
|
||||||
|
is not None
|
||||||
|
):
|
||||||
|
for video in videos:
|
||||||
|
if (
|
||||||
|
contains_nested(location.split("/")[-1], video["locations"])
|
||||||
|
is not None
|
||||||
|
):
|
||||||
|
return video["status"]
|
||||||
|
|
||||||
|
if generate_guids:
|
||||||
for guid in plex_search.guids:
|
for guid in plex_search.guids:
|
||||||
guid_source, guid_id = guid.id.split("://")
|
guid_source, guid_id = guid.id.split("://")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user