my-private-iptv-m3u/.forgejo/workflows/generate-m3u.yml
Workflow config file is invalid. Please check your config file: yaml: line 262: mapping values are not allowed in this context

286 lines
No EOL
9 KiB
YAML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

name: Generate M3U Playlist with Auto-Setup & Cleanup
on:
push:
branches:
- main
workflow_dispatch:
jobs:
build-and-cleanup:
runs-on: ubuntu-22.04
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Configure Git
run: |
git config --local user.email "actions@forgejo.plainrock127.xyz"
git config --local user.name "IPTV Playlist Bot"
- name: Auto-Setup Repository (First Run)
run: |
echo "=== Auto-Setup Check ==="
# Check if enhanced .gitignore exists
if [ ! -f .gitignore ] || ! grep -q "IPTV Playlist Generator" .gitignore; then
echo "🔧 Setting up enhanced .gitignore..."
cat > .gitignore << 'EOF'
# IPTV Playlist Generator - Enhanced .gitignore
# ===== PYTHON =====
__pycache__/
*.py[cod]
*$py.class
*.so
# ===== LOGS & TEMPORARY FILES =====
*.log
*.tmp
*_temp*
*.backup.*
temp_*
# ===== IDE & EDITOR FILES =====
.vscode/
.idea/
*.swp
*.swo
*~
.DS_Store
Thumbs.db
# ===== IPTV SPECIFIC =====
bulk_import_temp.m3u
import_temp_*.m3u
*_processing.m3u
playlist_temp.m3u
temp_playlist_*.m3u
EOF
echo "✅ Enhanced .gitignore created"
fi
# Create quick cleanup script if missing
if [ ! -f scripts/quick_cleanup.py ]; then
echo "🔧 Creating cleanup script..."
mkdir -p scripts
cat > scripts/quick_cleanup.py << 'EOF'
#!/usr/bin/env python3
"""Quick cleanup for IPTV repository"""
import os
import shutil
from pathlib import Path
def cleanup():
root = Path.cwd()
cleaned = 0
# Remove Python cache
for cache in root.rglob('__pycache__'):
if cache.is_dir():
shutil.rmtree(cache, ignore_errors=True)
cleaned += 1
# Remove temp files
for pattern in ['*.pyc', '*.pyo', '*_temp*', '*.tmp', '*~']:
for file in root.rglob(pattern):
if file.is_file() and '.git' not in str(file):
file.unlink(missing_ok=True)
cleaned += 1
# Organize logs
logs_dir = root / 'reports' / 'logs'
logs_dir.mkdir(parents=True, exist_ok=True)
for log in root.glob('*.log'):
shutil.move(str(log), str(logs_dir / log.name))
cleaned += 1
print(f"🧹 Cleaned {cleaned} items")
return cleaned
if __name__ == "__main__":
cleanup()
EOF
echo "✅ Cleanup script created"
fi
- name: Pre-Generation Cleanup
run: |
echo "=== Pre-Generation Cleanup ==="
# Remove Python cache thoroughly
find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
find . -name "*.pyc" -delete 2>/dev/null || true
find . -name "*.pyo" -delete 2>/dev/null || true
# Remove temporary files
find . -name "*_temp*" -type f -delete 2>/dev/null || true
find . -name "*.tmp" -delete 2>/dev/null || true
find . -name "*~" -delete 2>/dev/null || true
# Organize log files
mkdir -p reports/logs reports/archive
find . -maxdepth 1 -name "*.log" -exec mv {} reports/logs/ \; 2>/dev/null || true
# Compress old backups (older than 7 days)
find backups -name "*.txt" -type f -mtime +7 -exec gzip {} \; 2>/dev/null || true
echo "✅ Pre-cleanup completed"
- name: Setup Directories
run: |
echo "=== Directory Setup ==="
mkdir -p config backups reports/logs reports/archive templates
# Create scripts/__init__.py if missing
if [ ! -f scripts/__init__.py ]; then
echo '# Scripts package' > scripts/__init__.py
fi
- name: Debug File Structure
run: |
echo "=== File Structure ==="
echo "Import file status:"
if [ -f bulk_import.m3u ]; then
LINES=$(wc -l < bulk_import.m3u)
SIZE=$(du -h bulk_import.m3u | cut -f1)
echo "✅ bulk_import.m3u: $LINES lines, $SIZE"
if [ "$LINES" -gt 2 ]; then
echo "📥 Contains channels to process"
fi
else
echo "❌ bulk_import.m3u not found"
fi
- name: Run Playlist Generation
run: |
echo "=== Playlist Generation ==="
python scripts/generate_playlist.py
- name: Post-Generation Analysis
run: |
echo "=== Results Analysis ==="
if [ -f playlist.m3u ]; then
CHANNEL_COUNT=$(grep -c "^#EXTINF" playlist.m3u 2>/dev/null || echo "0")
FILE_SIZE=$(du -h playlist.m3u | cut -f1)
echo "✅ Generated playlist.m3u:"
echo " - Channels: $CHANNEL_COUNT"
echo " - Size: $FILE_SIZE"
# Show top 3 countries
echo " - Top countries:"
grep 'group-title=' playlist.m3u | sed 's/.*group-title="//; s/".*//' | sort | uniq -c | sort -nr | head -3 || true
else
echo "❌ playlist.m3u not generated"
fi
if [ -f channels.txt ]; then
CHANNELS_SIZE=$(du -h channels.txt | cut -f1)
echo "📁 channels.txt: $CHANNELS_SIZE"
fi
- name: Final Cleanup & Organization
run: |
echo "=== Final Organization ==="
# Run Python cleanup if script exists
if [ -f scripts/quick_cleanup.py ]; then
python scripts/quick_cleanup.py
fi
# Ensure bulk_import.m3u is clean for next use
if [ -f bulk_import.m3u ]; then
LINE_COUNT=$(wc -l < bulk_import.m3u)
if [ "$LINE_COUNT" -gt 2 ]; then
echo "🧹 Cleaning bulk_import.m3u for next import..."
echo '#EXTM3U' > bulk_import.m3u
echo '' >> bulk_import.m3u
fi
fi
# Remove any remaining clutter
find . -name "*.swp" -delete 2>/dev/null || true
find . -name ".DS_Store" -delete 2>/dev/null || true
echo "✅ Final cleanup completed"
- name: Commit Changes
run: |
echo "=== Committing Changes ==="
# Add specific files/directories (clean approach)
git add .gitignore || true
git add bulk_import.m3u || true
git add channels.txt || true
git add playlist.m3u || true
git add scripts/ || true
git add config/ || true
git add reports/ || true
git add backups/*.gz || true # Only compressed backups
git add templates/ || true
git add .forgejo/ || true
git add README.md || true
# Remove files that shouldn't be tracked
git rm --cached *.log 2>/dev/null || true
git rm --cached **/__pycache__/** 2>/dev/null || true
# Check what we're committing
echo "Files staged for commit:"
git diff --staged --name-only | head -10 || echo "No changes"
if ! git diff --staged --quiet; then
# Calculate stats for commit message
CHANNEL_COUNT="0"
REPO_SIZE="unknown"
if [ -f playlist.m3u ]; then
CHANNEL_COUNT=$(grep -c "^#EXTINF" playlist.m3u 2>/dev/null || echo "0")
fi
REPO_SIZE=$(du -sh . 2>/dev/null | cut -f1 || echo "unknown")
# Create clean commit message
COMMIT_MSG="📺 Updated playlist: $CHANNEL_COUNT channels ($(date '+%Y-%m-%d %H:%M'))
🧹 Auto-cleaned repository:
- Size: $REPO_SIZE
- Channels: $CHANNEL_COUNT
- Organized structure
- Ready for next import"
git commit -m "$COMMIT_MSG"
git push
echo "✅ Repository updated and cleaned"
echo "📺 Channels: $CHANNEL_COUNT"
echo "📁 Size: $REPO_SIZE"
else
echo " No changes to commit"
fi
- name: Success Summary
run: |
echo "=== Workflow Complete ==="
echo "🎉 IPTV Playlist Generator workflow finished successfully!"
echo ""
if [ -f playlist.m3u ]; then
CHANNEL_COUNT=$(grep -c "^#EXTINF" playlist.m3u 2>/dev/null || echo "0")
echo "📊 Results:"
echo " - Channels processed: $CHANNEL_COUNT"
echo " - Repository: Clean and organized"
echo " - Ready for: Next bulk import"
fi
echo ""
echo "🚀 Next steps:"
echo " 1. Add channels to bulk_import.m3u"
echo " 2. Push to trigger this workflow"
echo " 3. Your playlist will be automatically updated!"