From 27ef427bc563fb51e369c06a326c0e4434b570c2 Mon Sep 17 00:00:00 2001 From: stoney420 Date: Sat, 28 Jun 2025 02:03:51 +0200 Subject: [PATCH] Add .gitignore --- .gitignore | 552 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 552 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2e6b8fe --- /dev/null +++ b/.gitignore @@ -0,0 +1,552 @@ +#!/usr/bin/env python3 +""" +Complete IPTV Repository Setup & Cleanup +This script will set up all the cleanup automation and organize your repository +""" + +import os +import shutil +import subprocess +from pathlib import Path +from datetime import datetime + +def run_command(cmd, description): + """Run a command and show the result.""" + print(f"๐Ÿ”ง {description}...") + try: + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + if result.returncode == 0: + print(f" โœ… Success") + return True + else: + print(f" โš ๏ธ Warning: {result.stderr.strip()}") + return False + except Exception as e: + print(f" โŒ Error: {e}") + return False + +def create_file(file_path, content, description): + """Create a file with given content.""" + print(f"๐Ÿ“ Creating {description}...") + try: + file_path.parent.mkdir(parents=True, exist_ok=True) + with open(file_path, 'w', encoding='utf-8') as f: + f.write(content) + print(f" โœ… Created: {file_path}") + return True + except Exception as e: + print(f" โŒ Error creating {file_path}: {e}") + return False + +def main(): + """Set up complete repository cleanup and automation.""" + print("๐ŸŽฏ IPTV Repository Complete Setup") + print("=" * 50) + print("This will set up automated cleanup and organization for your repository") + print() + + root_path = Path.cwd() + + # Check if we're in the right directory + if not (root_path / 'scripts').exists(): + print("โŒ Error: Please run this script from your repository root directory") + print(" (The directory should contain a 'scripts' folder)") + return + + print(f"๐Ÿ“ Working in: {root_path}") + print() + + # Step 1: Create enhanced .gitignore + gitignore_content = """# IPTV Playlist Generator - Enhanced .gitignore + +# ===== PYTHON ===== +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# ===== LOGS & TEMPORARY FILES ===== +*.log +*.tmp +*_temp* +*.backup.* +temp_* +.temp/ + +# Specific log patterns +playlist_update.log +import_*.log +health_check_*.log + +# ===== BACKUP FILES ===== +# Keep backups directory but ignore temporary backups +backups/temp_* +backups/*.tmp +*.backup +*~ + +# ===== DEVELOPMENT & TESTING ===== +.pytest_cache/ +.coverage +htmlcov/ +.tox/ +.nox/ +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ + +# ===== IDE & EDITOR FILES ===== +.vscode/ +.idea/ +*.swp +*.swo +*~ +.DS_Store +Thumbs.db + +# ===== ENVIRONMENT & CONFIG ===== +.env +.env.local +.env.*.local +venv/ +env/ +ENV/ + +# ===== IPTV SPECIFIC ===== +# Temporary import files (keep the main one) +bulk_import_temp.m3u +import_temp_*.m3u +*_processing.m3u + +# Large test files +test_large_*.m3u +sample_*.m3u + +# Generated temporary playlists +playlist_temp.m3u +temp_playlist_*.m3u + +# ===== DOCUMENTATION BUILDS ===== +docs/_build/ +site/ + +# ===== ARCHIVE & COMPRESSED ===== +*.tar.gz +*.zip +*.rar +logs_archive_*.tar.gz + +# ===== SYSTEM FILES ===== +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db""" + + create_file(root_path / '.gitignore', gitignore_content, "Enhanced .gitignore") + + # Step 2: Create repository health monitor + repo_health_content = '''#!/usr/bin/env python3 +""" +Repository Health Monitor - Simplified for immediate use +""" + +import os +import shutil +import logging +from datetime import datetime, timedelta +from pathlib import Path +import gzip + +class SimpleRepoCleanup: + """Simplified repository cleanup for immediate use.""" + + def __init__(self): + self.root_path = Path.cwd() + self.cleaned_items = [] + + def run_cleanup(self): + """Run complete cleanup.""" + print("๐Ÿงน Starting repository cleanup...") + + # 1. Remove Python cache + self._clean_python_cache() + + # 2. Remove temporary files + self._clean_temp_files() + + # 3. Organize log files + self._organize_logs() + + # 4. Compress old backups + self._compress_backups() + + # 5. Ensure directory structure + self._ensure_directories() + + # 6. Clean import file + self._clean_import_file() + + print(f"\\nโœ… Cleanup complete! {len(self.cleaned_items)} items processed") + + return self.cleaned_items + + def _clean_python_cache(self): + """Remove Python cache files.""" + print(" ๐Ÿ Cleaning Python cache...") + + # Remove __pycache__ directories + for cache_dir in self.root_path.rglob('__pycache__'): + if cache_dir.is_dir(): + try: + shutil.rmtree(cache_dir) + self.cleaned_items.append(f"Removed cache: {cache_dir.relative_to(self.root_path)}") + except Exception: + pass + + # Remove .pyc and .pyo files + for pyc_file in list(self.root_path.rglob('*.pyc')) + list(self.root_path.rglob('*.pyo')): + try: + pyc_file.unlink() + self.cleaned_items.append(f"Removed: {pyc_file.relative_to(self.root_path)}") + except Exception: + pass + + def _clean_temp_files(self): + """Remove temporary files.""" + print(" ๐Ÿ—‘๏ธ Cleaning temporary files...") + + patterns = ['*_temp*', '*.tmp', '*~', '*.swp', '*.swo'] + + for pattern in patterns: + for temp_file in self.root_path.rglob(pattern): + if temp_file.is_file() and '.git' not in str(temp_file): + try: + temp_file.unlink() + self.cleaned_items.append(f"Removed temp: {temp_file.relative_to(self.root_path)}") + except Exception: + pass + + def _organize_logs(self): + """Organize log files.""" + print(" ๐Ÿ“‹ Organizing log files...") + + logs_dir = self.root_path / 'reports' / 'logs' + logs_dir.mkdir(parents=True, exist_ok=True) + + for log_file in self.root_path.glob('*.log'): + try: + new_location = logs_dir / log_file.name + shutil.move(str(log_file), str(new_location)) + self.cleaned_items.append(f"Moved log: {log_file.name} โ†’ reports/logs/") + except Exception: + pass + + def _compress_backups(self): + """Compress old backup files.""" + print(" ๐Ÿ—œ๏ธ Compressing old backups...") + + backup_dir = self.root_path / 'backups' + if backup_dir.exists(): + cutoff_date = datetime.now() - timedelta(days=7) + + for backup_file in backup_dir.glob('*.txt'): + try: + file_date = datetime.fromtimestamp(backup_file.stat().st_mtime) + if file_date < cutoff_date: + # Compress with gzip + with open(backup_file, 'rb') as f_in: + with gzip.open(f"{backup_file}.gz", 'wb') as f_out: + shutil.copyfileobj(f_in, f_out) + backup_file.unlink() + self.cleaned_items.append(f"Compressed: {backup_file.name}") + except Exception: + pass + + def _ensure_directories(self): + """Ensure proper directory structure.""" + print(" ๐Ÿ“ Ensuring directory structure...") + + directories = [ + 'config', + 'backups', + 'reports/logs', + 'reports/archive', + 'templates' + ] + + for directory in directories: + (self.root_path / directory).mkdir(parents=True, exist_ok=True) + + def _clean_import_file(self): + """Clean the import file if needed.""" + print(" ๐Ÿ“ฅ Checking import file...") + + import_file = self.root_path / 'bulk_import.m3u' + if import_file.exists(): + try: + with open(import_file, 'r', encoding='utf-8') as f: + content = f.read().strip() + + lines = content.split('\\n') + if len(lines) > 2 or any('#EXTINF' in line for line in lines): + with open(import_file, 'w', encoding='utf-8') as f: + f.write('#EXTM3U\\n') + self.cleaned_items.append("Cleared bulk_import.m3u (ready for next import)") + except Exception: + pass + +def main(): + """Run the cleanup.""" + cleanup = SimpleRepoCleanup() + cleanup.run_cleanup() + +if __name__ == "__main__": + main() +''' + + create_file(root_path / 'scripts' / 'quick_cleanup.py', repo_health_content, "Quick cleanup script") + + # Step 3: Create the enhanced workflow + workflow_content = """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: 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 + + - 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 "โœ… playlist.m3u: $CHANNEL_COUNT channels ($FILE_SIZE)" + else + echo "โŒ playlist.m3u not generated" + fi + + - name: Final Cleanup & Organization + run: | + echo "=== Final Organization ===" + + # Ensure bulk_import.m3u is clean + if [ -f bulk_import.m3u ]; then + LINE_COUNT=$(wc -l < bulk_import.m3u) + if [ "$LINE_COUNT" -gt 2 ]; then + echo '#EXTM3U' > bulk_import.m3u + echo '' >> bulk_import.m3u + echo "๐Ÿงน Cleaned bulk_import.m3u" + fi + fi + + - name: Commit Changes + run: | + echo "=== Committing Changes ===" + + # Add specific files only + 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 + + if ! git diff --staged --quiet; then + CHANNEL_COUNT="0" + if [ -f playlist.m3u ]; then + CHANNEL_COUNT=$(grep -c "^#EXTINF" playlist.m3u 2>/dev/null || echo "0") + fi + + git commit -m "๐Ÿ“บ Updated playlist: $CHANNEL_COUNT channels ($(date '+%Y-%m-%d %H:%M')) - Auto-cleaned" + git push + echo "โœ… Repository updated and cleaned" + else + echo "โ„น๏ธ No changes to commit" + fi""" + + workflow_dir = root_path / '.forgejo' / 'workflows' + create_file(workflow_dir / 'generate-m3u.yml', workflow_content, "Enhanced Forgejo workflow") + + # Step 4: Run immediate cleanup + print("\n" + "=" * 50) + print("๐Ÿงน IMMEDIATE CLEANUP") + print("=" * 50) + + # Import and run the cleanup + import sys + sys.path.insert(0, str(root_path / 'scripts')) + + try: + exec(repo_health_content) + cleanup = SimpleRepoCleanup() + cleaned_items = cleanup.run_cleanup() + except Exception as e: + print(f"Running manual cleanup instead: {e}") + + # Manual cleanup + print("๐Ÿงน Running manual cleanup...") + cleaned_items = [] + + # Remove Python cache + for cache_dir in root_path.rglob('__pycache__'): + if cache_dir.is_dir(): + try: + shutil.rmtree(cache_dir) + cleaned_items.append(f"Removed: {cache_dir.relative_to(root_path)}") + except: + pass + + # Remove temp files + patterns = ['*.pyc', '*.pyo', '*_temp*', '*.tmp', '*~'] + for pattern in patterns: + for file_path in root_path.rglob(pattern): + if file_path.is_file() and '.git' not in str(file_path): + try: + file_path.unlink() + cleaned_items.append(f"Removed: {file_path.relative_to(root_path)}") + except: + pass + + # Organize logs + logs_dir = root_path / 'reports' / 'logs' + logs_dir.mkdir(parents=True, exist_ok=True) + + for log_file in root_path.glob('*.log'): + try: + shutil.move(str(log_file), str(logs_dir / log_file.name)) + cleaned_items.append(f"Moved: {log_file.name} โ†’ reports/logs/") + except: + pass + + # Step 5: Setup git hooks (optional) + print("\n" + "=" * 50) + print("๐Ÿ”ง OPTIONAL GIT SETUP") + print("=" * 50) + + # Check if this is a git repository + if (root_path / '.git').exists(): + print("๐Ÿ“ Setting up git configuration...") + + # Add files to git + run_command("git add .gitignore", "Adding .gitignore") + run_command("git add scripts/quick_cleanup.py", "Adding cleanup script") + run_command("git add .forgejo/workflows/generate-m3u.yml", "Adding enhanced workflow") + + print(" โœ… Files staged for commit") + else: + print(" โ„น๏ธ Not a git repository, skipping git setup") + + # Step 6: Final summary + print("\n" + "=" * 50) + print("โœ… SETUP COMPLETE!") + print("=" * 50) + + print(f"๐Ÿ“Š Summary:") + print(f" - Cleaned {len(cleaned_items)} items") + print(f" - Created enhanced .gitignore") + print(f" - Added quick cleanup script") + print(f" - Updated Forgejo workflow") + print(f" - Organized directory structure") + + print(f"\n๐ŸŽฏ What's New:") + print(f" ๐Ÿ“ reports/logs/ - All logs organized here") + print(f" ๐Ÿงน scripts/quick_cleanup.py - Manual cleanup tool") + print(f" ๐Ÿ”„ Enhanced workflow - Automatic cleanup on push") + print(f" ๐Ÿšซ .gitignore - Prevents future clutter") + + print(f"\n๐Ÿš€ Next Steps:") + print(f" 1. Commit these changes: git commit -m 'Setup automated cleanup'") + print(f" 2. Push to trigger workflow: git push") + print(f" 3. For manual cleanup: python scripts/quick_cleanup.py") + print(f" 4. Your repository will now stay clean automatically!") + + print(f"\n๐ŸŽ‰ Your IPTV repository is now clean and organized!") + +if __name__ == "__main__": + main() \ No newline at end of file