92 lines
3.0 KiB
Python
92 lines
3.0 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Generate feed-master configuration from channels.yml.
|
|
This ensures a single source of truth for the YouTube channels.
|
|
"""
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
from .channel_config import build_rss_bridge_url, load_channel_entries
|
|
|
|
|
|
def generate_fm_config(channels_file, output_file, rss_bridge_host="rss-bridge"):
|
|
"""Generate feed-master YAML configuration from channels.yml"""
|
|
|
|
print(f"Reading channels from {channels_file}")
|
|
channels = load_channel_entries(Path(channels_file))
|
|
print(f"Found {len(channels)} channels")
|
|
|
|
# Generate feed configuration
|
|
config = []
|
|
config.append("# Feed Master Configuration")
|
|
config.append("# Auto-generated from channels.yml")
|
|
config.append("# Do not edit manually - regenerate using generate_feed_config.py")
|
|
config.append("")
|
|
config.append("feeds:")
|
|
config.append(" youtube-unified:")
|
|
config.append(" title: YouTube Unified Feed")
|
|
config.append(" description: Aggregated feed from all YouTube channels")
|
|
config.append(" link: https://youtube.com")
|
|
config.append(' language: "en-us"')
|
|
config.append(" sources:")
|
|
|
|
processed = 0
|
|
skipped = 0
|
|
|
|
for channel in channels:
|
|
if not channel.get("rss_enabled", True):
|
|
skipped += 1
|
|
continue
|
|
bridge_url = build_rss_bridge_url(channel, rss_bridge_host=rss_bridge_host)
|
|
if not bridge_url:
|
|
skipped += 1
|
|
continue
|
|
name = channel.get("name", "Unknown")
|
|
config.append(f" - name: {name}")
|
|
config.append(f" url: {bridge_url}")
|
|
processed += 1
|
|
|
|
# Add system configuration
|
|
config.append("")
|
|
config.append("system:")
|
|
config.append(" update: 5m")
|
|
config.append(" max_per_feed: 5")
|
|
config.append(" max_total: 200")
|
|
config.append(" max_keep: 1000")
|
|
config.append(" base_url: http://localhost:8097")
|
|
|
|
# Write output
|
|
print(f"\nProcessed {processed} channels, skipped {skipped}")
|
|
|
|
with open(output_file, 'w') as f:
|
|
f.write('\n'.join(config))
|
|
|
|
print(f"Configuration written to {output_file}")
|
|
print(f"\nTo apply this configuration:")
|
|
print(f" 1. Copy {output_file} to feed-master/etc/fm.yml")
|
|
print(f" 2. Restart the feed-master service")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
# Default paths
|
|
script_dir = Path(__file__).parent
|
|
channels_file = script_dir / "channels.yml"
|
|
output_file = script_dir / "feed-master-config" / "fm.yml"
|
|
|
|
# Allow overriding via command line
|
|
if len(sys.argv) > 1:
|
|
channels_file = Path(sys.argv[1])
|
|
if len(sys.argv) > 2:
|
|
output_file = Path(sys.argv[2])
|
|
|
|
if not channels_file.exists():
|
|
print(f"Error: {channels_file} not found", file=sys.stderr)
|
|
print(f"\nUsage: {sys.argv[0]} [channels.yml] [output.yml]", file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
# Ensure output directory exists
|
|
output_file.parent.mkdir(parents=True, exist_ok=True)
|
|
|
|
generate_fm_config(channels_file, output_file)
|