Added reload databases

This commit is contained in:
Pirates IRC
2025-11-13 13:24:48 -06:00
committed by GitHub
parent 46d941165b
commit ab50523f06

View File

@@ -11,7 +11,7 @@ import logging
from glob import glob from glob import glob
# Version: YY.DDD.HHMM (Julian date format: Year.DayOfYear.Time) # Version: YY.DDD.HHMM (Julian date format: Year.DayOfYear.Time)
__version__ = "25.317.1200" __version__ = "25.317.1900"
# Setup logging # Setup logging
LOGGER = logging.getLogger("plugins.fuzzy_matcher") LOGGER = logging.getLogger("plugins.fuzzy_matcher")
@@ -85,6 +85,7 @@ class FuzzyMatcher:
self.premium_channels = [] # Channel names only (for fuzzy matching) self.premium_channels = [] # Channel names only (for fuzzy matching)
self.premium_channels_full = [] # Full channel objects with category self.premium_channels_full = [] # Full channel objects with category
self.channel_lookup = {} # Callsign -> channel data mapping self.channel_lookup = {} # Callsign -> channel data mapping
self.country_codes = None # Track which country databases are currently loaded
# Load all channel databases if plugin_dir is provided # Load all channel databases if plugin_dir is provided
if self.plugin_dir: if self.plugin_dir:
@@ -107,7 +108,99 @@ class FuzzyMatcher:
for channel_file in channel_files: for channel_file in channel_files:
try: try:
with open(channel_file, 'r', encoding='utf-8') as f: with open(channel_file, 'r', encoding='utf-8') as f:
channels_list = json.load(f) data = json.load(f)
# Extract the channels array from the JSON structure
channels_list = data.get('channels', []) if isinstance(data, dict) else data
file_broadcast = 0
file_premium = 0
for channel in channels_list:
channel_type = channel.get('type', '').lower()
if 'broadcast' in channel_type or channel_type == 'broadcast (ota)':
# Broadcast channel with callsign
self.broadcast_channels.append(channel)
file_broadcast += 1
# Create lookup by callsign
callsign = channel.get('callsign', '').strip()
if callsign:
self.channel_lookup[callsign] = channel
# Also store base callsign without suffix for easier matching
base_callsign = re.sub(r'-(?:TV|CD|LP|DT|LD)$', '', callsign)
if base_callsign != callsign:
self.channel_lookup[base_callsign] = channel
else:
# Premium/cable/national channel
channel_name = channel.get('channel_name', '').strip()
if channel_name:
self.premium_channels.append(channel_name)
self.premium_channels_full.append(channel)
file_premium += 1
total_broadcast += file_broadcast
total_premium += file_premium
self.logger.info(f"Loaded from {os.path.basename(channel_file)}: {file_broadcast} broadcast, {file_premium} premium channels")
except Exception as e:
self.logger.error(f"Error loading {channel_file}: {e}")
self.logger.info(f"Total channels loaded: {total_broadcast} broadcast, {total_premium} premium")
return True
def reload_databases(self, country_codes=None):
"""
Reload channel databases with specific country codes.
Args:
country_codes: List of country codes to load (e.g., ['US', 'UK', 'CA'])
If None, loads all available databases.
Returns:
bool: True if databases were loaded successfully, False otherwise
"""
# Clear existing channel data
self.broadcast_channels = []
self.premium_channels = []
self.premium_channels_full = []
self.channel_lookup = {}
# Update country_codes tracking
self.country_codes = country_codes
# Determine which files to load
if country_codes:
# Load only specified country databases
channel_files = []
for code in country_codes:
file_path = os.path.join(self.plugin_dir, f"{code}_channels.json")
if os.path.exists(file_path):
channel_files.append(file_path)
else:
self.logger.warning(f"Channel database not found: {code}_channels.json")
else:
# Load all available databases
pattern = os.path.join(self.plugin_dir, "*_channels.json")
channel_files = glob(pattern)
if not channel_files:
self.logger.warning(f"No channel database files found to load")
return False
self.logger.info(f"Loading {len(channel_files)} channel database file(s): {[os.path.basename(f) for f in channel_files]}")
total_broadcast = 0
total_premium = 0
for channel_file in channel_files:
try:
with open(channel_file, 'r', encoding='utf-8') as f:
data = json.load(f)
# Extract the channels array from the JSON structure
channels_list = data.get('channels', []) if isinstance(data, dict) else data
file_broadcast = 0 file_broadcast = 0
file_premium = 0 file_premium = 0