import re import requests import argparse import time # Import the time module def fetch_content_and_extract_filenames(url, seen_albums, seen_filenames): # Regex to detect file and potential album links file_link_pattern = re.compile(r'https://files\.catbox\.moe/[\w\-.]+(?:\.jpg|\.jpeg|\.png|\.webm)') album_link_pattern = re.compile(r'https://catbox\.moe/c/[\w\-.]+') # Corrected album URL pattern try: response = requests.get(url) response.raise_for_status() content = response.text # Extract all file links file_links = file_link_pattern.findall(content) filenames = [] for link in file_links: filename = link.split('/')[-1] if filename not in seen_filenames: seen_filenames.add(filename) filenames.append(filename) # Check for album links within the content, recurse if found album_links = album_link_pattern.findall(content) for album_link in album_links: if album_link not in seen_albums: seen_albums.add(album_link) additional_filenames = fetch_content_and_extract_filenames(album_link, seen_albums, seen_filenames) filenames.extend(additional_filenames) return filenames except requests.RequestException as e: print(f"Failed to fetch URL {url}: {e}") return [] def create_album_with_filenames(url): # Extract identifier from the URL identifier = url.split('/')[-1] board_id = url.split('/')[-3] seen_filenames = set() seen_albums = set(url) # Fetch content from the URL and extract filenames filenames = fetch_content_and_extract_filenames(url, seen_albums, seen_filenames) # URL and data for creating the album album_url = "https://catbox.moe/user/api.php" data = { 'reqtype': 'createalbum', 'title': f"Album for /{board_id}/{identifier}", 'desc': f"Album for /{board_id}/{identifier}", 'files': ' '.join(filenames) } # Send request to create the album try: album_response = requests.post(album_url, data=data) if album_response.status_code == 200: print(f"Detected Unique Filenames: {len(seen_filenames)}") print(f"[/{board_id}/{identifier}]({url}) | [{len(seen_filenames)} Images]({album_response.text})") return f"[/{board_id}/{identifier}]({url}) | [{len(seen_filenames)} Images]({album_response.text})" else: return f"[/{board_id}/{identifier}]({url}) | Failed to create album" except requests.RequestException as e: return f"[/{board_id}/{identifier}]({url}) | Failed to send album creation request: {e}" if __name__ == "__main__": parser = argparse.ArgumentParser(description="Create an album from images and nested albums within a thread or album, ensuring no duplicate filenames while maintaining order.") parser.add_argument("file", help="Text file containing URLs to process.") parser.add_argument("output", help="Output text file to save created album URLs.") args = parser.parse_args() # Reading URLs from a file with open(args.file, 'r') as file: urls = file.read().splitlines() album_urls = [] for url in urls: formatted_output = create_album_with_filenames(url) album_urls.append(formatted_output) time.sleep(5) # Pause for 5 seconds before processing the next URL # Writing output album URLs to a file with open(args.output, 'w') as output_file: for album_url in album_urls: output_file.write(album_url + '\n')