129 lines
No EOL
4.3 KiB
Python
129 lines
No EOL
4.3 KiB
Python
import re
|
|
import os
|
|
from datetime import datetime
|
|
|
|
# Simple cleanup utility for corrupted channels.txt
|
|
CHANNELS_FILE = 'channels.txt'
|
|
|
|
def clean_channels_file():
|
|
"""Clean up corrupted channels.txt file."""
|
|
|
|
if not os.path.exists(CHANNELS_FILE):
|
|
print("❌ channels.txt not found")
|
|
return
|
|
|
|
print("🔧 Starting cleanup of channels.txt...")
|
|
|
|
# Read the file
|
|
with open(CHANNELS_FILE, 'r', encoding='utf-8') as f:
|
|
content = f.read()
|
|
|
|
print(f"📄 Read {len(content)} characters from channels.txt")
|
|
|
|
# Split into channel blocks
|
|
channel_blocks = re.split(r'\n\s*\n+', content.strip())
|
|
print(f"📋 Found {len(channel_blocks)} channel blocks")
|
|
|
|
cleaned_channels = []
|
|
fixed_count = 0
|
|
|
|
for i, block in enumerate(channel_blocks):
|
|
if not block.strip():
|
|
continue
|
|
|
|
print(f"🔍 Processing block {i+1}...")
|
|
|
|
# Parse the block
|
|
channel = {}
|
|
lines = block.strip().split('\n')
|
|
|
|
for line in lines:
|
|
if '=' in line:
|
|
key, value = line.split('=', 1)
|
|
channel[key.strip()] = value.strip()
|
|
|
|
if not channel:
|
|
continue
|
|
|
|
stream_name = channel.get('Stream name', 'Unknown')
|
|
print(f" Channel: {stream_name}")
|
|
|
|
# Clean Stream URL
|
|
stream_url = channel.get('Stream URL', '')
|
|
original_url = stream_url
|
|
|
|
if '#EXTINF' in stream_url:
|
|
stream_url = stream_url.split('#EXTINF')[0].strip()
|
|
fixed_count += 1
|
|
print(f" ✅ Fixed Stream URL (removed #EXTINF)")
|
|
|
|
if 'group-title=' in stream_url:
|
|
stream_url = stream_url.split('group-title=')[0].strip()
|
|
fixed_count += 1
|
|
print(f" ✅ Fixed Stream URL (removed group-title)")
|
|
|
|
# Remove any trailing junk
|
|
stream_url = re.sub(r'\s+.*$', '', stream_url)
|
|
|
|
if stream_url != original_url:
|
|
print(f" 🔧 URL: {original_url[:50]}... → {stream_url[:50]}...")
|
|
|
|
channel['Stream URL'] = stream_url
|
|
|
|
# Clean Logo URL
|
|
logo_url = channel.get('Logo', '')
|
|
original_logo = logo_url
|
|
|
|
if logo_url and 'group-title=' in logo_url:
|
|
logo_url = logo_url.split('group-title=')[0].strip()
|
|
fixed_count += 1
|
|
print(f" ✅ Fixed Logo URL")
|
|
|
|
if logo_url and '#EXTINF' in logo_url:
|
|
logo_url = logo_url.split('#EXTINF')[0].strip()
|
|
fixed_count += 1
|
|
print(f" ✅ Fixed Logo URL")
|
|
|
|
channel['Logo'] = logo_url
|
|
|
|
cleaned_channels.append(channel)
|
|
|
|
print(f"\n📊 Summary:")
|
|
print(f" Total channels: {len(cleaned_channels)}")
|
|
print(f" Fixes applied: {fixed_count}")
|
|
|
|
if fixed_count > 0:
|
|
# Create backup
|
|
backup_name = f"{CHANNELS_FILE}.backup.{datetime.now().strftime('%Y%m%d_%H%M%S')}"
|
|
print(f"💾 Creating backup: {backup_name}")
|
|
|
|
try:
|
|
import shutil
|
|
shutil.copy2(CHANNELS_FILE, backup_name)
|
|
print(f"✅ Backup created successfully")
|
|
except Exception as e:
|
|
print(f"⚠️ Could not create backup: {e}")
|
|
|
|
# Write cleaned file
|
|
print(f"📝 Writing cleaned channels.txt...")
|
|
|
|
with open(CHANNELS_FILE, 'w', encoding='utf-8') as f:
|
|
for i, channel in enumerate(cleaned_channels):
|
|
if i > 0:
|
|
f.write("\n\n")
|
|
|
|
# Write channel block
|
|
f.write(f"Group = {channel.get('Group', 'Uncategorized')}\n")
|
|
f.write(f"Stream name = {channel.get('Stream name', 'Unknown Channel')}\n")
|
|
f.write(f"Logo = {channel.get('Logo', '')}\n")
|
|
f.write(f"EPG id = {channel.get('EPG id', '')}\n")
|
|
f.write(f"Stream URL = {channel.get('Stream URL', '')}")
|
|
|
|
print(f"✅ Successfully cleaned and rewrote channels.txt!")
|
|
print(f"🎉 Fixed {fixed_count} corrupted entries")
|
|
|
|
else:
|
|
print("✅ No corrupted entries found - file is already clean!")
|
|
|
|
if __name__ == "__main__":
|
|
clean_channels_file() |