This commit is contained in:
Pirates IRC
2025-11-03 08:16:16 -06:00
committed by GitHub
parent 09d1651a14
commit ac6f377636

View File

@@ -31,11 +31,18 @@ class Plugin:
"""Dispatcharr Stream-Mapparr Plugin""" """Dispatcharr Stream-Mapparr Plugin"""
name = "Stream-Mapparr" name = "Stream-Mapparr"
version = "0.4" version = "0.5.0a"
description = "Automatically add matching streams to channels based on name similarity and quality precedence with enhanced fuzzy matching" description = "Automatically add matching streams to channels based on name similarity and quality precedence with enhanced fuzzy matching"
# Settings rendered by UI # Settings rendered by UI
fields = [ fields = [
{
"id": "overwrite_streams",
"label": "Overwrite Existing Streams",
"type": "boolean",
"default": True,
"help_text": "If enabled, all existing streams will be removed and replaced with matched streams. If disabled, only new streams will be added (existing streams preserved).",
},
{ {
"id": "fuzzy_match_threshold", "id": "fuzzy_match_threshold",
"label": "Fuzzy Match Threshold", "label": "Fuzzy Match Threshold",
@@ -1083,11 +1090,17 @@ class Plugin:
ignore_tags = processed_data.get('ignore_tags', []) ignore_tags = processed_data.get('ignore_tags', [])
visible_channel_limit = processed_data.get('visible_channel_limit', 1) visible_channel_limit = processed_data.get('visible_channel_limit', 1)
# Get overwrite_streams setting
overwrite_streams = settings.get('overwrite_streams', True)
if isinstance(overwrite_streams, str):
overwrite_streams = overwrite_streams.lower() in ('true', 'yes', '1')
if not channels: if not channels:
return {"status": "error", "message": "No channels found in processed data."} return {"status": "error", "message": "No channels found in processed data."}
logger.info(f"[Stream-Mapparr] Adding streams to {len(channels)} channels") logger.info(f"[Stream-Mapparr] Adding streams to {len(channels)} channels")
logger.info(f"[Stream-Mapparr] Visible channel limit: {visible_channel_limit}") logger.info(f"[Stream-Mapparr] Visible channel limit: {visible_channel_limit}")
logger.info(f"[Stream-Mapparr] Overwrite existing streams: {overwrite_streams}")
# Group channels by their cleaned name # Group channels by their cleaned name
channel_groups = {} channel_groups = {}
@@ -1142,14 +1155,27 @@ class Plugin:
try: try:
if matched_streams: if matched_streams:
# Remove existing stream assignments if overwrite_streams:
ChannelStream.objects.filter(channel_id=channel_id).delete() # Remove existing stream assignments
existing_count = ChannelStream.objects.filter(channel_id=channel_id).count()
if existing_count > 0:
ChannelStream.objects.filter(channel_id=channel_id).delete()
logger.info(f"[Stream-Mapparr] Removed {existing_count} existing stream(s) from channel '{channel_name}'")
else:
# Get existing stream IDs to avoid duplicates
existing_stream_ids = set(
ChannelStream.objects.filter(channel_id=channel_id).values_list('stream_id', flat=True)
)
# Add ALL matched streams (already sorted by quality) # Add ALL matched streams (already sorted by quality)
streams_added_count = 0 streams_added_count = 0
for stream in matched_streams: for stream in matched_streams:
stream_id = stream['id'] stream_id = stream['id']
# Skip if stream already exists and we're not overwriting
if not overwrite_streams and stream_id in existing_stream_ids:
continue
ChannelStream.objects.create( ChannelStream.objects.create(
channel_id=channel_id, channel_id=channel_id,
stream_id=stream_id stream_id=stream_id
@@ -1169,13 +1195,26 @@ class Plugin:
'matched_streams': len(matched_streams) 'matched_streams': len(matched_streams)
}) })
logger.info(f"[Stream-Mapparr] Added {streams_added_count} stream(s) to channel '{channel_name}'") if overwrite_streams:
logger.info(f"[Stream-Mapparr] Replaced streams with {streams_added_count} new stream(s) for channel '{channel_name}'")
else:
logger.info(f"[Stream-Mapparr] Added {streams_added_count} new stream(s) to channel '{channel_name}'")
if streams_added_count == 0:
logger.info(f"[Stream-Mapparr] All matched streams already exist for channel '{channel_name}'")
else: else:
# No matches found - remove existing streams # No matches found
existing_count = ChannelStream.objects.filter(channel_id=channel_id).count() if overwrite_streams:
if existing_count > 0: # Remove existing streams only if overwrite is enabled
ChannelStream.objects.filter(channel_id=channel_id).delete() existing_count = ChannelStream.objects.filter(channel_id=channel_id).count()
logger.info(f"[Stream-Mapparr] Removed {existing_count} stream(s) from channel '{channel_name}' (no matches found)") if existing_count > 0:
ChannelStream.objects.filter(channel_id=channel_id).delete()
logger.info(f"[Stream-Mapparr] Removed {existing_count} stream(s) from channel '{channel_name}' (no matches found)")
else:
logger.info(f"[Stream-Mapparr] No matches found for channel '{channel_name}'")
else:
# Keep existing streams
existing_count = ChannelStream.objects.filter(channel_id=channel_id).count()
logger.info(f"[Stream-Mapparr] No matches found for channel '{channel_name}', keeping {existing_count} existing stream(s)")
channels_without_matches += 1 channels_without_matches += 1
@@ -1210,8 +1249,9 @@ class Plugin:
logger.info(f"[Stream-Mapparr] Update report exported to {filepath}") logger.info(f"[Stream-Mapparr] Update report exported to {filepath}")
# Create summary message # Create summary message
mode_description = "Replaced existing streams" if overwrite_streams else "Added new streams (preserved existing)"
message_parts = [ message_parts = [
f"Stream assignment completed:", f"Stream assignment completed ({mode_description}):",
f"• Channels updated: {channels_updated}", f"• Channels updated: {channels_updated}",
f"• Total streams added: {total_streams_added}", f"• Total streams added: {total_streams_added}",
f"• Channels skipped (exceeds limit): {channels_skipped}", f"• Channels skipped (exceeds limit): {channels_skipped}",