Upload files to "/"
This commit is contained in:
		
						commit
						4451fb81e6
					
				
							
								
								
									
										154
									
								
								download.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								download.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,154 @@ | |||||||
|  | 
 | ||||||
|  | import requests | ||||||
|  | import re | ||||||
|  | import os | ||||||
|  | import subprocess | ||||||
|  | import concurrent.futures | ||||||
|  | import pwd | ||||||
|  | import grp | ||||||
|  | from urllib.parse import urljoin, unquote | ||||||
|  | from bs4 import BeautifulSoup | ||||||
|  | 
 | ||||||
|  | BASE_URL = "http://0.0.0.0:8000" | ||||||
|  | MAX_WORKERS = 4 | ||||||
|  | 
 | ||||||
|  | def get_folders(): | ||||||
|  |     try: | ||||||
|  |         response = requests.get(BASE_URL, timeout=10) | ||||||
|  |         response.raise_for_status() | ||||||
|  |          | ||||||
|  |         # Parse HTML to find directory links | ||||||
|  |         soup = BeautifulSoup(response.text, 'html.parser') | ||||||
|  |         folders = [] | ||||||
|  |          | ||||||
|  |         # Look for links that end with '/' (directories) | ||||||
|  |         for link in soup.find_all('a', href=True): | ||||||
|  |             href = link['href'] | ||||||
|  |             if href.endswith('/') and href not in ['/', '../']: | ||||||
|  |                 # Decode URL-encoded folder names | ||||||
|  |                 folder_name = unquote(href) | ||||||
|  |                 folders.append(folder_name) | ||||||
|  |          | ||||||
|  |         return sorted(set(folders)) | ||||||
|  |      | ||||||
|  |     except Exception as e: | ||||||
|  |         print(f"Error fetching folder list: {e}") | ||||||
|  |         return [] | ||||||
|  | 
 | ||||||
|  | def change_ownership(folder_path): | ||||||
|  |     try: | ||||||
|  |         current_user = pwd.getpwuid(os.getuid()) | ||||||
|  |         uid = current_user.pw_uid | ||||||
|  |         gid = current_user.pw_gid | ||||||
|  |          | ||||||
|  |         for root, dirs, files in os.walk(folder_path): | ||||||
|  |             os.chown(root, uid, gid) | ||||||
|  |             for file in files: | ||||||
|  |                 file_path = os.path.join(root, file) | ||||||
|  |                 try: | ||||||
|  |                     os.chown(file_path, uid, gid) | ||||||
|  |                 except (OSError, IOError) as e: | ||||||
|  |                     print(f"    Warning: Could not change ownership of {file_path}: {e}") | ||||||
|  |          | ||||||
|  |         print(f"    ✓ Changed ownership of {folder_path} to {current_user.pw_name}") | ||||||
|  |          | ||||||
|  |     except Exception as e: | ||||||
|  |         print(f"    Warning: Could not change ownership of {folder_path}: {e}") | ||||||
|  | 
 | ||||||
|  | def download_folder(folder): | ||||||
|  |     clean_folder = folder.rstrip('/') | ||||||
|  |      | ||||||
|  |     if os.path.exists(clean_folder): | ||||||
|  |         print(f"⏭ Skipping existing folder: {clean_folder}") | ||||||
|  |         return True | ||||||
|  |      | ||||||
|  |     print(f"Starting download of: {clean_folder}") | ||||||
|  |      | ||||||
|  |     try: | ||||||
|  |         cmd = [ | ||||||
|  |             "wget", | ||||||
|  |             "--recursive", | ||||||
|  |             "--no-parent", | ||||||
|  |             "--no-host-directories", | ||||||
|  |             "--reject=index.html*", | ||||||
|  |             "--continue", | ||||||
|  |             "--progress=bar", | ||||||
|  |             "--tries=3", | ||||||
|  |             "--timeout=30", | ||||||
|  |             urljoin(BASE_URL, folder) | ||||||
|  |         ] | ||||||
|  |          | ||||||
|  |         # Run wget | ||||||
|  |         result = subprocess.run(cmd, capture_output=True, text=True) | ||||||
|  |          | ||||||
|  |         if result.returncode == 0: | ||||||
|  |             print(f"✓ Completed download of: {clean_folder}") | ||||||
|  |              | ||||||
|  |             # Change ownership of downloaded folder | ||||||
|  |             if os.path.exists(clean_folder): | ||||||
|  |                 change_ownership(clean_folder) | ||||||
|  |              | ||||||
|  |             return True | ||||||
|  |         else: | ||||||
|  |             print(f"✗ Failed to download: {clean_folder}") | ||||||
|  |             print(f"Error: {result.stderr}") | ||||||
|  |             return False | ||||||
|  |              | ||||||
|  |     except Exception as e: | ||||||
|  |         print(f"✗ Exception downloading {folder}: {e}") | ||||||
|  |         return False | ||||||
|  | 
 | ||||||
|  | def main(): | ||||||
|  |     print("Discovering folders from server...") | ||||||
|  |     folders = get_folders() | ||||||
|  |      | ||||||
|  |     if not folders: | ||||||
|  |         print("No folders found on the server!") | ||||||
|  |         return | ||||||
|  |      | ||||||
|  |     existing_folders = [] | ||||||
|  |     new_folders = [] | ||||||
|  |      | ||||||
|  |     for folder in folders: | ||||||
|  |         clean_folder = folder.rstrip('/') | ||||||
|  |         if os.path.exists(clean_folder): | ||||||
|  |             existing_folders.append(clean_folder) | ||||||
|  |         else: | ||||||
|  |             new_folders.append(folder) | ||||||
|  |      | ||||||
|  |     print(f"Found {len(folders)} total folders:") | ||||||
|  |     if existing_folders: | ||||||
|  |         print(f"  Existing folders (will be skipped): {len(existing_folders)}") | ||||||
|  |         for folder in existing_folders: | ||||||
|  |             print(f"    - {folder}") | ||||||
|  |     if new_folders: | ||||||
|  |         print(f"  New folders to download: {len(new_folders)}") | ||||||
|  |         for folder in new_folders: | ||||||
|  |             print(f"    - {folder.rstrip('/')}") | ||||||
|  |      | ||||||
|  |     if not new_folders: | ||||||
|  |         print("\nAll folders already exist. Nothing to download!") | ||||||
|  |         return | ||||||
|  |      | ||||||
|  |     response = input(f"\nDo you want to download these {len(new_folders)} new folders? (y/N): ") | ||||||
|  |     if response.lower() != 'y': | ||||||
|  |         print("Download cancelled.") | ||||||
|  |         return | ||||||
|  |      | ||||||
|  |     print(f"\nStarting parallel downloads with {MAX_WORKERS} workers...") | ||||||
|  |      | ||||||
|  |     success_count = 0 | ||||||
|  |     with concurrent.futures.ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor: | ||||||
|  |         future_to_folder = {executor.submit(download_folder, folder): folder for folder in new_folders} | ||||||
|  |          | ||||||
|  |         for future in concurrent.futures.as_completed(future_to_folder): | ||||||
|  |             if future.result(): | ||||||
|  |                 success_count += 1 | ||||||
|  |      | ||||||
|  |     print(f"\nDownload summary:") | ||||||
|  |     print(f"  Successfully downloaded: {success_count}/{len(new_folders)} folders") | ||||||
|  |     print(f"  Files saved in: current directory") | ||||||
|  | 
 | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     main() | ||||||
|  | 
 | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user