From d3c84ae556309fcaed9655783320a6c510c56157 Mon Sep 17 00:00:00 2001 From: IPTV Playlist Bot Date: Sat, 28 Jun 2025 01:10:20 +0000 Subject: [PATCH] Updated playlist: 1 channels - 2025-06-28 01:10 --- backups/archive/channels_20250627_222923.gz | Bin 0 -> 45 bytes backups/archive/channels_20250627_225834.gz | Bin 0 -> 201 bytes backups/channels_20250627_222923.txt | 0 backups/channels_20250627_224445.txt | 5 - backups/channels_20250627_224445.txt.gz | Bin 0 -> 172 bytes backups/channels_20250627_225834.txt | 11 - backups/channels_20250627_230205.txt | 11 - backups/channels_20250627_230205.txt.gz | Bin 0 -> 201 bytes backups/channels_20250628_002450.txt | 11 - backups/channels_20250628_002450.txt.gz | Bin 0 -> 201 bytes comprehensive_cleanup.py | 260 -------- .../playlist_report_20250627_221302.md | 0 .../playlist_report_20250627_222923.md | 0 .../playlist_report_20250627_224445.md | 0 .../playlist_report_20250627_225834.md | 0 .../playlist_report_20250627_230205.md | 0 .../playlist_report_20250628_002450.md | 0 reports/daily/report_20250628_011019.md | 4 + reports/playlist_report_20250628_011018.md | 19 + .../channel_processor.cpython-311.pyc | Bin 27889 -> 0 bytes .../config_manager.cpython-311.pyc | Bin 14390 -> 0 bytes .../__pycache__/file_manager.cpython-311.pyc | Bin 9155 -> 0 bytes .../health_checker.cpython-311.pyc | Bin 14905 -> 0 bytes .../playlist_builder.cpython-311.pyc | Bin 6189 -> 0 bytes .../report_generator.cpython-311.pyc | Bin 10080 -> 0 bytes scripts/config/group_overrides.json | 4 - scripts/config/patterns.json | 600 ------------------ scripts/config/settings.json | 16 - setup_clean_repo.py | 552 ---------------- 29 files changed, 23 insertions(+), 1470 deletions(-) create mode 100644 backups/archive/channels_20250627_222923.gz create mode 100644 backups/archive/channels_20250627_225834.gz delete mode 100644 backups/channels_20250627_222923.txt delete mode 100644 backups/channels_20250627_224445.txt create mode 100644 backups/channels_20250627_224445.txt.gz delete mode 100644 backups/channels_20250627_225834.txt delete mode 100644 backups/channels_20250627_230205.txt create mode 100644 backups/channels_20250627_230205.txt.gz delete mode 100644 backups/channels_20250628_002450.txt create mode 100644 backups/channels_20250628_002450.txt.gz delete mode 100644 comprehensive_cleanup.py rename reports/{ => daily}/playlist_report_20250627_221302.md (100%) rename reports/{ => daily}/playlist_report_20250627_222923.md (100%) rename reports/{ => daily}/playlist_report_20250627_224445.md (100%) rename reports/{ => daily}/playlist_report_20250627_225834.md (100%) rename reports/{ => daily}/playlist_report_20250627_230205.md (100%) rename reports/{ => daily}/playlist_report_20250628_002450.md (100%) create mode 100644 reports/daily/report_20250628_011019.md create mode 100644 reports/playlist_report_20250628_011018.md delete mode 100644 scripts/__pycache__/channel_processor.cpython-311.pyc delete mode 100644 scripts/__pycache__/config_manager.cpython-311.pyc delete mode 100644 scripts/__pycache__/file_manager.cpython-311.pyc delete mode 100644 scripts/__pycache__/health_checker.cpython-311.pyc delete mode 100644 scripts/__pycache__/playlist_builder.cpython-311.pyc delete mode 100644 scripts/__pycache__/report_generator.cpython-311.pyc delete mode 100644 scripts/config/group_overrides.json delete mode 100644 scripts/config/patterns.json delete mode 100644 scripts/config/settings.json delete mode 100644 setup_clean_repo.py diff --git a/backups/archive/channels_20250627_222923.gz b/backups/archive/channels_20250627_222923.gz new file mode 100644 index 0000000000000000000000000000000000000000..d90ca54e6169e21ab2917aee3676181af62e9cce GIT binary patch literal 45 tcmb2|=HU3|5TC*HKRF{YFE2HxINr#>$kf2h$UNT2$jH*jn1PuA1^_`p3X%W- literal 0 HcmV?d00001 diff --git a/backups/archive/channels_20250627_225834.gz b/backups/archive/channels_20250627_225834.gz new file mode 100644 index 0000000000000000000000000000000000000000..f04589c7398072edee82e1b64420e6802331ea84 GIT binary patch literal 201 zcmV;)05<<0iwFqzKwoGA|6^!jZf<34b6+wrGBq$ZGB;l`GBr3eGyroi$}cTYuvPdl zzkLl5FINc7%PdJvQSi>pOHawqR`AWNP;m2b z;qu8(&j-q6l#~<{Tj}d(>SZP+=_Tjun`cL6nWiV}7iU-M=4Mvt738IJxdyl^WTrsO z2`<_az;N=?jF$V<#k1qo(XLM0S@Gb0GV>?h2VH5OabH^nga_dAR76X2Wa=4e~)U aD$%f_Sg$OzK;Os!1S|k|za9&k0002H_ea10 literal 0 HcmV?d00001 diff --git a/backups/channels_20250627_225834.txt b/backups/channels_20250627_225834.txt deleted file mode 100644 index 13999fd..0000000 --- a/backups/channels_20250627_225834.txt +++ /dev/null @@ -1,11 +0,0 @@ -Group = ๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom -Stream name = Sky Sports Mix FHD -Logo = https://i.ibb.co/7kYj5gc/sky-mix.png -EPG id = SkySp.Mix.HD.uk -Stream URL = https://a1xs.vip/2000008 - -Group = Sports -Stream name = Sky Sports Mix FHD -Logo = https://i.ibb.co/7kYj5gc/sky-mix.png -EPG id = SkySp.Mix.HD.uk -Stream URL = https://a1xs.vip/2000008 \ No newline at end of file diff --git a/backups/channels_20250627_230205.txt b/backups/channels_20250627_230205.txt deleted file mode 100644 index 00a07d4..0000000 --- a/backups/channels_20250627_230205.txt +++ /dev/null @@ -1,11 +0,0 @@ -Group = ๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom -Stream name = Sky Sports Mix FHD -Logo = https://i.ibb.co/7kYj5gc/sky-mix.png -EPG id = SkySp.Mix.HD.uk -Stream URL = https://a1xs.vip/2000008 - -Group = ๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom -Stream name = Sky Sports Mix FHD -Logo = https://i.ibb.co/7kYj5gc/sky-mix.png -EPG id = SkySp.Mix.HD.uk -Stream URL = https://a1xs.vip/2000008 \ No newline at end of file diff --git a/backups/channels_20250627_230205.txt.gz b/backups/channels_20250627_230205.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..bac4f630dfc00dd0acfb9932d8853ce14a083c0c GIT binary patch literal 201 zcmV;)05<<0iwFqzKwoGA|6^!jZf<34b6+wrGBq$ZGB;l`GcYnRH7;~`bO3WN$}cTY zuvPdlzkLl5FINc7%PdJvQSi>pOHawqR`AWN zP;m2b;qu8(&j-q6l#~<{Tj}d(>SZP+=_Tjun`cL6nWiV}7iU-M=4Mvt738IJxdyl^ zWTrsO2`bO3WN$}cTY zuvPdlzkLl5FINc7%PdJvQSi>pOHawqR`AWN zP;m2b;qu8(&j-q6l#~<{Tj}d(>SZP+=_Tjun`cL6nWiV}7iU-M=4Mvt738IJxdyl^ zWTrsO2` 3: - # Keep 3 most recent, compress the rest - for old_backup in backup_files[3:]: - try: - archive_dir = backups_dir / 'archive' - archive_dir.mkdir(exist_ok=True) - compressed_path = archive_dir / f"{old_backup.stem}.gz" - with open(old_backup, 'rb') as f_in: - with gzip.open(compressed_path, 'wb') as f_out: - shutil.copyfileobj(f_in, f_out) - old_backup.unlink() - cleaned.append(f"Compressed & archived: {old_backup.name}") - except Exception as e: - print(f" Warning: {e}") - - # Compress remaining backups - for backup_file in backups_dir.glob('channels_*.txt'): - try: - compressed_path = backup_file.with_suffix('.txt.gz') - if not compressed_path.exists(): - with open(backup_file, 'rb') as f_in: - with gzip.open(compressed_path, 'wb') as f_out: - shutil.copyfileobj(f_in, f_out) - backup_file.unlink() - cleaned.append(f"Compressed: {backup_file.name}") - except Exception as e: - print(f" Warning: {e}") - - # 3. Organize reports - print("๐Ÿ“‹ Organizing reports...") - reports_dir = root_path / 'reports' - - # Move scattered report files to daily/ - for report_file in reports_dir.glob('playlist_report_*.md'): - try: - daily_dir = reports_dir / 'daily' - daily_dir.mkdir(exist_ok=True) - new_path = daily_dir / report_file.name - shutil.move(str(report_file), str(new_path)) - cleaned.append(f"Moved: {report_file.name} โ†’ reports/daily/") - except Exception as e: - print(f" Warning: {e}") - - # Archive old reports (older than 7 days) - cutoff_date = datetime.now() - timedelta(days=7) - daily_dir = reports_dir / 'daily' - - if daily_dir.exists(): - for report_file in daily_dir.glob('*.md'): - try: - file_date = datetime.fromtimestamp(report_file.stat().st_mtime) - if file_date < cutoff_date: - month_folder = reports_dir / 'archive' / file_date.strftime('%Y-%m') - month_folder.mkdir(parents=True, exist_ok=True) - new_path = month_folder / report_file.name - shutil.move(str(report_file), str(new_path)) - cleaned.append(f"Archived: {report_file.name}") - except Exception as e: - print(f" Warning: {e}") - - # 4. Remove Python cache completely - print("๐Ÿ Removing Python cache...") - for cache_dir in root_path.rglob('__pycache__'): - if cache_dir.is_dir(): - try: - shutil.rmtree(cache_dir) - cleaned.append(f"Removed: {cache_dir.relative_to(root_path)}") - except Exception as e: - print(f" Warning: {e}") - - for pyc_file in list(root_path.rglob('*.pyc')) + list(root_path.rglob('*.pyo')): - try: - pyc_file.unlink() - cleaned.append(f"Removed: {pyc_file.relative_to(root_path)}") - except Exception as e: - print(f" Warning: {e}") - - # 5. Clean scripts folder - print("๐Ÿ”ง Cleaning scripts folder...") - scripts_dir = root_path / 'scripts' - - # Remove scripts/config if it exists and move files to main config - scripts_config = scripts_dir / 'config' - if scripts_config.exists(): - try: - main_config = root_path / 'config' - main_config.mkdir(exist_ok=True) - for config_file in scripts_config.rglob('*'): - if config_file.is_file(): - new_path = main_config / config_file.name - if not new_path.exists(): - shutil.move(str(config_file), str(new_path)) - cleaned.append(f"Moved: {config_file.name} from scripts/config/") - shutil.rmtree(scripts_config) - cleaned.append("Removed: scripts/config/ directory") - except Exception as e: - print(f" Warning: {e}") - - # Ensure __init__.py exists - init_file = scripts_dir / '__init__.py' - if not init_file.exists(): - with open(init_file, 'w') as f: - f.write('# IPTV Scripts Package\n') - cleaned.append("Created: scripts/__init__.py") - - # 6. Clean root directory - print("๐Ÿงน Cleaning root directory...") - - # Remove setup scripts from root - for setup_file in root_path.glob('setup_*.py'): - try: - setup_file.unlink() - cleaned.append(f"Removed: {setup_file.name}") - except Exception as e: - print(f" Warning: {e}") - - # Move log files to proper location - logs_dir = reports_dir / 'logs' - logs_dir.mkdir(exist_ok=True) - - for log_file in root_path.glob('*.log'): - try: - new_path = logs_dir / log_file.name - shutil.move(str(log_file), str(new_path)) - cleaned.append(f"Moved: {log_file.name} โ†’ reports/logs/") - except Exception as e: - print(f" Warning: {e}") - - # Remove temporary files - patterns = ['*_temp*', '*.tmp', '*~', '*.swp', '*.swo'] - for pattern in patterns: - for temp_file in root_path.glob(pattern): - if temp_file.is_file(): - try: - temp_file.unlink() - cleaned.append(f"Removed: {temp_file.name}") - except Exception as e: - print(f" Warning: {e}") - - # 7. Create data snapshot - print("๐Ÿ“Š Creating data snapshot...") - channels_file = root_path / 'channels.txt' - if channels_file.exists(): - try: - today = datetime.now() - data_dir = root_path / 'data' / today.strftime('%Y-%m') - data_dir.mkdir(parents=True, exist_ok=True) - - snapshot_name = f"channels_{today.strftime('%Y%m%d')}.txt" - snapshot_path = data_dir / snapshot_name - - if not snapshot_path.exists(): - shutil.copy2(channels_file, snapshot_path) - cleaned.append(f"Created: data snapshot {snapshot_name}") - except Exception as e: - print(f" Warning: {e}") - - # 8. Remove this cleanup script after running - cleanup_script = root_path / 'comprehensive_cleanup.py' - if cleanup_script.exists(): - try: - cleanup_script.unlink() - cleaned.append("Removed: comprehensive_cleanup.py (cleanup complete)") - except Exception as e: - print(f" Warning: Could not remove cleanup script: {e}") - - print(f"\nโœ… Cleanup complete! Processed {len(cleaned)} items") - - if cleaned: - print("\n๐Ÿ”ง Actions taken:") - for item in cleaned[:10]: # Show first 10 - print(f" โœ… {item}") - if len(cleaned) > 10: - print(f" ... and {len(cleaned) - 10} more items") - - # Repository status - print(f"\n๐Ÿ“Š Repository status:") - try: - total_files = len(list(root_path.rglob('*'))) - repo_size = sum(f.stat().st_size for f in root_path.rglob('*') - if f.is_file() and '.git' not in str(f)) - repo_size_mb = repo_size / (1024 * 1024) - - print(f" ๐Ÿ“ Total files: {total_files}") - print(f" ๐Ÿ’พ Repository size: {repo_size_mb:.1f} MB") - - # Check cleanliness - cache_dirs = len(list(root_path.rglob('__pycache__'))) - temp_files = len(list(root_path.rglob('*.tmp'))) - log_files_root = len(list(root_path.glob('*.log'))) - - print(f" ๐Ÿงน Cache directories: {cache_dirs}") - print(f" ๐Ÿ—‘๏ธ Temp files: {temp_files}") - print(f" ๐Ÿ“‹ Root log files: {log_files_root}") - - if cache_dirs == 0 and temp_files == 0 and log_files_root == 0: - print(" โœ… Repository is now clean!") - else: - print(" ๐ŸŸก Some cleanup items remain") - - except Exception as e: - print(f" Could not calculate stats: {e}") - - return True - - except Exception as e: - print(f"โŒ Error during cleanup: {e}") - return False - -if __name__ == "__main__": - success = cleanup_repository() - if success: - print("\n๐ŸŽ‰ Repository cleanup successful!") - else: - print("\nโš ๏ธ Repository cleanup completed with warnings") \ No newline at end of file diff --git a/reports/playlist_report_20250627_221302.md b/reports/daily/playlist_report_20250627_221302.md similarity index 100% rename from reports/playlist_report_20250627_221302.md rename to reports/daily/playlist_report_20250627_221302.md diff --git a/reports/playlist_report_20250627_222923.md b/reports/daily/playlist_report_20250627_222923.md similarity index 100% rename from reports/playlist_report_20250627_222923.md rename to reports/daily/playlist_report_20250627_222923.md diff --git a/reports/playlist_report_20250627_224445.md b/reports/daily/playlist_report_20250627_224445.md similarity index 100% rename from reports/playlist_report_20250627_224445.md rename to reports/daily/playlist_report_20250627_224445.md diff --git a/reports/playlist_report_20250627_225834.md b/reports/daily/playlist_report_20250627_225834.md similarity index 100% rename from reports/playlist_report_20250627_225834.md rename to reports/daily/playlist_report_20250627_225834.md diff --git a/reports/playlist_report_20250627_230205.md b/reports/daily/playlist_report_20250627_230205.md similarity index 100% rename from reports/playlist_report_20250627_230205.md rename to reports/daily/playlist_report_20250627_230205.md diff --git a/reports/playlist_report_20250628_002450.md b/reports/daily/playlist_report_20250628_002450.md similarity index 100% rename from reports/playlist_report_20250628_002450.md rename to reports/daily/playlist_report_20250628_002450.md diff --git a/reports/daily/report_20250628_011019.md b/reports/daily/report_20250628_011019.md new file mode 100644 index 0000000..57f54c7 --- /dev/null +++ b/reports/daily/report_20250628_011019.md @@ -0,0 +1,4 @@ +# Playlist Report - Sat Jun 28 01:10:19 UTC 2025 +- Channels: 1 +- Size: 4.0K +- Generated: Sat Jun 28 01:10:19 UTC 2025 diff --git a/reports/playlist_report_20250628_011018.md b/reports/playlist_report_20250628_011018.md new file mode 100644 index 0000000..c5a4e81 --- /dev/null +++ b/reports/playlist_report_20250628_011018.md @@ -0,0 +1,19 @@ +# IPTV Playlist Generation Report +**Generated:** 2025-06-28 01:10:18 + +## Summary Statistics +- **Total channels processed:** 2 +- **Valid channels:** 1 +- **Duplicates removed:** 1 +- **New channels imported:** 0 +- **Countries detected:** 1 + +## Channel Distribution by Country +- **๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom:** 1 channels + +## Configuration +- **Remove duplicates:** True +- **Auto country detection:** True +- **Quality detection:** True +- **Adult content filtering:** True +- **Health check enabled:** False diff --git a/scripts/__pycache__/channel_processor.cpython-311.pyc b/scripts/__pycache__/channel_processor.cpython-311.pyc deleted file mode 100644 index 6f8b2902c10abc7b743f3c58a01b306f44d18b6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27889 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 Mcfb6SD5Q!0H@pJEXaE2J diff --git a/scripts/__pycache__/config_manager.cpython-311.pyc b/scripts/__pycache__/config_manager.cpython-311.pyc deleted file mode 100644 index 246f45fc4ff90941ea20815ed0c94091db04f5c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14390 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 YJI6dVM-cuzs!o5@p8vE%sWw~x3vlu$+yDRo diff --git a/scripts/__pycache__/health_checker.cpython-311.pyc b/scripts/__pycache__/health_checker.cpython-311.pyc deleted file mode 100644 index 9af5b020f048ebe043da7ef215fac9f640eac91b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14905 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 diff --git a/scripts/__pycache__/report_generator.cpython-311.pyc b/scripts/__pycache__/report_generator.cpython-311.pyc deleted file mode 100644 index 61fac71f94726835f2cce84767799f5302c098a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10080 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 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