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

246 lines
No EOL
8.7 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-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: Pre-Cleanup Health Check
run: |
echo "=== Repository Health Check ==="
python -c "
import sys, os
sys.path.insert(0, 'scripts')
from repo_health import RepoHealthMonitor
monitor = RepoHealthMonitor()
health = monitor.run_health_check()
print(f'Organization Score: {health[\"organization_score\"]}/100')
print(f'Total Size: {health[\"repository_size\"][\"total_mb\"]:.1f} MB')
print(f'Files: {health[\"file_counts\"][\"total_files\"]}')
if health['cleanup_suggestions']:
print('Cleanup needed:')
for suggestion in health['cleanup_suggestions'][:3]:
print(f' - {suggestion}')
" 2>/dev/null || echo "Health check skipped (first run)"
- name: Auto-Cleanup Repository
run: |
echo "=== Auto-Cleanup Phase ==="
# 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
# Clean backup files older than 30 days
find backups -name "*.txt" -type f -mtime +30 -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 "✅ 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
# Ensure proper directory structure
ls -la scripts/ || echo "Scripts directory missing"
- name: Debug File Structure
run: |
echo "=== File Structure Debug ==="
echo "Root files:"
ls -la | head -20
echo ""
echo "Scripts directory:"
ls -la scripts/ 2>/dev/null || echo "Scripts directory not found"
echo ""
echo "Import file status:"
if [ -f bulk_import.m3u ]; then
echo "✅ bulk_import.m3u found ($(wc -l < bulk_import.m3u) lines, $(du -h bulk_import.m3u | cut -f1))"
echo "First few lines:"
head -5 bulk_import.m3u
else
echo "❌ bulk_import.m3u not found"
fi
- name: Run Playlist Generation
run: |
echo "=== Playlist Generation ==="
python scripts/generate_playlist.py
- name: Post-Generation Health Check
run: |
echo "=== Post-Generation 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 "✅ playlist.m3u generated:"
echo " - Channels: $CHANNEL_COUNT"
echo " - Size: $FILE_SIZE"
# Show top countries
echo " - Top countries:"
grep 'group-title=' playlist.m3u | sed 's/.*group-title="//; s/".*//' | sort | uniq -c | sort -nr | head -5 || echo " No country data"
else
echo "❌ playlist.m3u not generated"
fi
if [ -f channels.txt ]; then
CHANNELS_SIZE=$(du -h channels.txt | cut -f1)
CHANNELS_LINES=$(wc -l < channels.txt)
echo "📁 channels.txt: $CHANNELS_SIZE ($CHANNELS_LINES lines)"
fi
# Check for any error logs
if [ -f reports/logs/playlist_update.log ]; then
echo "📋 Recent log entries:"
tail -10 reports/logs/playlist_update.log || tail -10 playlist_update.log 2>/dev/null || echo "No logs found"
fi
- name: Repository Cleanup & Organization
run: |
echo "=== Final Repository Organization ==="
# Remove any remaining cache files
find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
# Move any stray log files
find . -maxdepth 1 -name "*.log" -exec mv {} reports/logs/ \; 2>/dev/null || true
# Clean up any editor backup files
find . -name "*~" -delete 2>/dev/null || true
find . -name "*.swp" -delete 2>/dev/null || true
# Ensure bulk_import.m3u is clean for next use
if [ -f bulk_import.m3u ]; then
# If it has more than just the header, it means it wasn't cleaned by the script
LINE_COUNT=$(wc -l < bulk_import.m3u)
if [ "$LINE_COUNT" -gt 2 ]; then
echo "⚠️ Manually cleaning bulk_import.m3u (had $LINE_COUNT lines)"
echo '#EXTM3U' > bulk_import.m3u
echo '' >> bulk_import.m3u
fi
fi
echo "✅ Repository organized"
- name: Commit Changes
run: |
echo "=== Committing Changes ==="
# Add specific files/directories (exclude unnecessary items)
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
git add .gitignore || true
# Remove any files that shouldn't be tracked
git rm --cached *.log 2>/dev/null || true
git rm --cached **/__pycache__/** 2>/dev/null || true
git rm --cached **/*.pyc 2>/dev/null || true
# Check what we're about to commit
echo "Files to be committed:"
git diff --staged --name-only || echo "No staged changes"
if ! git diff --staged --quiet; then
# Calculate channel count for commit message
CHANNEL_COUNT="0"
if [ -f playlist.m3u ]; then
CHANNEL_COUNT=$(grep -c "^#EXTINF" playlist.m3u 2>/dev/null || echo "0")
fi
# Calculate repository size
REPO_SIZE=$(du -sh . 2>/dev/null | cut -f1 || echo "unknown")
# Create informative commit message
COMMIT_MSG="📺 Updated playlist: $CHANNEL_COUNT channels ($(date '+%Y-%m-%d %H:%M'))
Repository Status:
- Size: $REPO_SIZE
- Channels: $CHANNEL_COUNT
- Auto-cleaned and organized
- $(date '+%Y-%m-%d %H:%M:%S UTC')"
git commit -m "$COMMIT_MSG"
git push
echo "✅ Repository updated successfully"
echo " 📺 Channels: $CHANNEL_COUNT"
echo " 📁 Size: $REPO_SIZE"
else
echo " No changes to commit"
fi
- name: Final Status Report
run: |
echo "=== Final Status Report ==="
echo "🎯 Workflow completed successfully!"
echo ""
echo "📊 Repository Statistics:"
echo " - Total files: $(find . -type f | wc -l)"
echo " - Directory size: $(du -sh . | cut -f1)"
echo " - Git status: $(git status --porcelain | wc -l) pending changes"
echo ""
if [ -f playlist.m3u ]; then
CHANNEL_COUNT=$(grep -c "^#EXTINF" playlist.m3u 2>/dev/null || echo "0")
echo "✅ Playlist Status:"
echo " - Channels: $CHANNEL_COUNT"
echo " - File size: $(du -h playlist.m3u | cut -f1)"
echo " - Last updated: $(date)"
else
echo "❌ No playlist generated"
fi
echo ""
echo "🧹 Cleanup Summary:"
echo " - Python cache: Removed"
echo " - Log files: Organized in reports/logs/"
echo " - Backup files: Compressed if older than 7 days"
echo " - Temporary files: Cleaned"
echo ""
echo "🚀 Ready for next import!"