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

279 lines
No EOL
9.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 Repository
run: |
echo "=== Pre-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
find . -name "*.swp" -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
# Clean backup files older than 30 days
find backups -name "*.txt" -type f -mtime +30 -delete 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
# Ensure proper directory structure
echo "Directory structure verified"
- name: Debug File Structure
run: |
echo "=== File Structure Debug ==="
echo "Root files:"
ls -la | head -15
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
LINES=$(wc -l < bulk_import.m3u)
SIZE=$(du -h bulk_import.m3u | cut -f1)
echo "✅ bulk_import.m3u found: $LINES lines ($SIZE)"
if [ "$LINES" -gt 2 ]; then
echo "📥 Contains channels to process"
echo "First few lines:"
head -3 bulk_import.m3u
else
echo "📭 Empty (ready for import)"
fi
else
echo "❌ bulk_import.m3u not found"
fi
- name: Run Playlist Generation
run: |
echo "=== Playlist Generation ==="
# Check if generate_playlist.py exists
if [ ! -f scripts/generate_playlist.py ]; then
echo "❌ Error: scripts/generate_playlist.py not found"
exit 1
fi
# Run the playlist generation
echo "🚀 Starting playlist generation..."
python scripts/generate_playlist.py
echo "✅ Playlist generation completed"
- name: Post-Generation Analysis
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 "✅ Generated playlist.m3u:"
echo " 📺 Channels: $CHANNEL_COUNT"
echo " 📁 Size: $FILE_SIZE"
# Show top countries if available
echo " 🌍 Top countries:"
if grep -q 'group-title=' playlist.m3u; then
grep 'group-title=' playlist.m3u | \
sed 's/.*group-title="//; s/".*//' | \
sort | uniq -c | sort -nr | head -5 | \
while read count country; do
echo " $country: $count channels"
done
else
echo " No country grouping found"
fi
else
echo "❌ playlist.m3u not generated"
echo "Checking for errors..."
if [ -f reports/logs/playlist_update.log ]; then
echo "Last few log entries:"
tail -10 reports/logs/playlist_update.log
fi
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)"
else
echo "📋 channels.txt: Not found"
fi
- name: Final Cleanup & Organization
run: |
echo "=== Final Organization ==="
# Remove any remaining cache/temp files
find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
find . -name "*.pyc" -delete 2>/dev/null || true
find . -name "*.swp" -delete 2>/dev/null || true
find . -name ".DS_Store" -delete 2>/dev/null || true
find . -name "*~" -delete 2>/dev/null || true
# Move any stray log files to reports/logs
find . -maxdepth 1 -name "*.log" -exec mv {} reports/logs/ \; 2>/dev/null || true
# 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
echo "✅ bulk_import.m3u cleared and ready"
else
echo "✅ bulk_import.m3u already clean"
fi
fi
echo "✅ Final cleanup completed"
- name: Repository Health Check
run: |
echo "=== Repository Health Check ==="
# Calculate repository stats
TOTAL_FILES=$(find . -type f | grep -v '.git' | wc -l)
REPO_SIZE=$(du -sh . 2>/dev/null | cut -f1 || echo "unknown")
echo "📊 Repository Statistics:"
echo " 📁 Total files: $TOTAL_FILES"
echo " 💾 Repository size: $REPO_SIZE"
# Check for common issues
CACHE_DIRS=$(find . -type d -name "__pycache__" | wc -l)
TEMP_FILES=$(find . -name "*.tmp" -o -name "*_temp*" | wc -l)
LOG_FILES_ROOT=$(find . -maxdepth 1 -name "*.log" | wc -l)
echo "🔍 Cleanliness Check:"
echo " 🐍 Python cache dirs: $CACHE_DIRS"
echo " 🗑️ Temporary files: $TEMP_FILES"
echo " 📋 Root log files: $LOG_FILES_ROOT"
if [ "$CACHE_DIRS" -eq 0 ] && [ "$TEMP_FILES" -eq 0 ] && [ "$LOG_FILES_ROOT" -eq 0 ]; then
echo "✅ Repository is clean!"
else
echo "⚠️ Some cleanup items remain"
fi
- name: Commit Changes
run: |
echo "=== Committing Changes ==="
# Add specific files/directories only (clean approach)
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
git add templates/ || true
git add .forgejo/ || true
git add README.md || true
git add .gitignore || true
# Remove 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 staged for commit:"
git diff --staged --name-only | head -10 || echo "No staged changes"
if ! git diff --staged --quiet; then
# Calculate stats for commit message
CHANNEL_COUNT="0"
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 informative commit message
COMMIT_MSG="📺 Updated playlist: $CHANNEL_COUNT channels ($(date '+%Y-%m-%d %H:%M'))
🧹 Repository Status:
- Channels: $CHANNEL_COUNT
- Size: $REPO_SIZE
- 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: Workflow Summary
run: |
echo "=== Workflow Summary ==="
echo "🎉 IPTV Playlist workflow completed!"
echo ""
if [ -f playlist.m3u ]; then
CHANNEL_COUNT=$(grep -c "^#EXTINF" playlist.m3u 2>/dev/null || echo "0")
echo "✅ Success Summary:"
echo " 📺 Playlist generated with $CHANNEL_COUNT channels"
echo " 🧹 Repository cleaned and organized"
echo " 📁 Files properly structured"
echo " 🚀 Ready for next import"
else
echo "⚠️ Playlist not generated - check logs"
fi
echo ""
echo "📋 Next Steps:"
echo " 1. Add channels to bulk_import.m3u"
echo " 2. Push changes to trigger workflow"
echo " 3. Playlist will be automatically updated"