Skip to content

Commit 8b9b818

Browse files
committed
Detect and track existing Plex scans from activities
- Updated api_pending_scans to check Plex activities for running scans - Automatically adds scans that aren't already tracked in PENDING_SCANS - Uses activity subtitle (item name) for better display names - Now shows scans that were started outside the web UI - Matches activities to library sections by librarySectionID
1 parent 0cdafe6 commit 8b9b818

1 file changed

Lines changed: 72 additions & 9 deletions

File tree

media_watcher_service.py

Lines changed: 72 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ def check_scan_status(scan_id: str) -> str:
6969
# Get current activities from Plex
7070
from plex_utils import get_plex_activities, is_plex_scanning
7171
activities = get_plex_activities()
72-
72+
7373
# Check if there are any scanning activities
7474
has_scanning_activity = len(activities) > 0
7575

@@ -84,20 +84,23 @@ def check_scan_status(scan_id: str) -> str:
8484
# Activities might have librarySectionID in context
8585
context = activity.get('context', {})
8686
if isinstance(context, dict):
87-
act_section_id = context.get('librarySectionID') or context.get('sectionID')
87+
act_section_id = context.get(
88+
'librarySectionID') or context.get('sectionID')
8889
if act_section_id and str(act_section_id) == str(section_id):
8990
section_scanning = True
90-
logger.info(f"Found scanning activity for section {section_id}")
91+
logger.info(
92+
f"Found scanning activity for section {section_id}")
9193
break
92-
94+
9395
# Also check using the section's refreshing attribute
9496
if not section_scanning:
9597
section_scanning = is_plex_scanning(section_id)
96-
98+
9799
if not section_scanning:
98100
# No scanning activity found, check timeout
99101
scan_timestamp = datetime.fromisoformat(scan_info["timestamp"])
100-
time_since_scan = (datetime.now() - scan_timestamp).total_seconds()
102+
time_since_scan = (
103+
datetime.now() - scan_timestamp).total_seconds()
101104
# If no activity and it's been more than 2 minutes, assume completed
102105
if time_since_scan > 120:
103106
scan_info["status"] = "completed"
@@ -133,8 +136,10 @@ def check_scan_status(scan_id: str) -> str:
133136
section_id = int(library_key)
134137
is_scanning = is_plex_scanning(section_id)
135138
if not is_scanning:
136-
scan_timestamp = datetime.fromisoformat(scan_info["timestamp"])
137-
time_since_scan = (datetime.now() - scan_timestamp).total_seconds()
139+
scan_timestamp = datetime.fromisoformat(
140+
scan_info["timestamp"])
141+
time_since_scan = (
142+
datetime.now() - scan_timestamp).total_seconds()
138143
if time_since_scan > 120: # 2 minutes
139144
scan_info["status"] = "completed"
140145
scan_info["completed_at"] = datetime.now().isoformat()
@@ -1093,8 +1098,66 @@ def api_plex_item_scan():
10931098

10941099
@app.route('/api/plex/pending-scans', methods=['GET'])
10951100
def api_pending_scans():
1096-
"""Gets the list of pending scans."""
1101+
"""Gets the list of pending scans, including currently running scans from Plex."""
10971102
try:
1103+
# First, check Plex activities for any currently running scans
1104+
from plex_utils import get_plex_activities, get_plex_client
1105+
activities = get_plex_activities()
1106+
1107+
# Track which section IDs we've already seen in PENDING_SCANS
1108+
tracked_sections = set()
1109+
for scan_info in PENDING_SCANS.values():
1110+
library_key = scan_info.get("library_key")
1111+
if library_key:
1112+
tracked_sections.add(str(library_key))
1113+
1114+
# Add any running scans from activities that aren't already tracked
1115+
plex = get_plex_client()
1116+
for activity in activities:
1117+
context = activity.get('context', {})
1118+
library_section_id = context.get('librarySectionID')
1119+
1120+
if library_section_id and str(library_section_id) not in tracked_sections:
1121+
# This is a scan we haven't tracked yet, add it
1122+
try:
1123+
# Get library name
1124+
library_name = f"Library {library_section_id}"
1125+
if plex:
1126+
try:
1127+
section = plex.library.sectionByID(int(library_section_id))
1128+
if section:
1129+
library_name = section.title
1130+
except:
1131+
pass
1132+
1133+
# Get activity details for better naming
1134+
activity_title = activity.get('title', '')
1135+
activity_subtitle = activity.get('subtitle', '')
1136+
1137+
# Use subtitle if available (often contains item name like "Carmen Sandiego (2015)")
1138+
display_name = library_name
1139+
if activity_subtitle:
1140+
display_name = f"{library_name}: {activity_subtitle}"
1141+
elif activity_title:
1142+
display_name = f"{library_name}: {activity_title}"
1143+
1144+
# Create a scan ID for this activity
1145+
activity_key = activity.get('key', '')
1146+
scan_id = f"activity_{library_section_id}_{activity_key[:8] if activity_key else uuid.uuid4().hex[:8]}"
1147+
1148+
# Only add if we don't already have this scan_id
1149+
if scan_id not in PENDING_SCANS:
1150+
add_pending_scan(
1151+
"library",
1152+
scan_id,
1153+
display_name,
1154+
library_key=str(library_section_id)
1155+
)
1156+
tracked_sections.add(str(library_section_id))
1157+
logger.info(f"Added untracked scan from activities: {display_name} (section {library_section_id})")
1158+
except Exception as e:
1159+
logger.warning(f"Error adding scan from activity: {e}")
1160+
10981161
# Update status for all pending scans
10991162
for scan_id in list(PENDING_SCANS.keys()):
11001163
scan_info = PENDING_SCANS[scan_id]

0 commit comments

Comments
 (0)