first commit
This commit is contained in:
164
setup.py
Normal file
164
setup.py
Normal file
@@ -0,0 +1,164 @@
|
||||
"""
|
||||
Setup wizard for Social Media Collection Downloader.
|
||||
Run this first to configure your collections, cookies, and options.
|
||||
"""
|
||||
|
||||
import json
|
||||
import sys
|
||||
import os
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
CONFIG_DIR = Path(__file__).parent / "config"
|
||||
CONFIG_PATH = CONFIG_DIR / "config.json"
|
||||
CONFIG_DIR.mkdir(exist_ok=True)
|
||||
|
||||
|
||||
def check_dependency(cmd: str, name: str, install_hint: str) -> bool:
|
||||
try:
|
||||
subprocess.run([cmd, "--version"], capture_output=True, check=True)
|
||||
print(f" ✓ {name} found")
|
||||
return True
|
||||
except (FileNotFoundError, subprocess.CalledProcessError):
|
||||
print(f" ✗ {name} not found — {install_hint}")
|
||||
return False
|
||||
|
||||
|
||||
def check_dependencies():
|
||||
print("\n── Checking dependencies ──────────────────────────────────")
|
||||
ok = True
|
||||
ok &= check_dependency("yt-dlp", "yt-dlp", "pip install yt-dlp")
|
||||
try:
|
||||
from playwright.sync_api import sync_playwright
|
||||
print(" ✓ Playwright found")
|
||||
except ImportError:
|
||||
print(" ✗ Playwright not found — pip install playwright && playwright install chromium")
|
||||
ok = False
|
||||
return ok
|
||||
|
||||
|
||||
def prompt(question: str, default: str = "") -> str:
|
||||
if default:
|
||||
val = input(f" {question} [{default}]: ").strip()
|
||||
return val if val else default
|
||||
else:
|
||||
return input(f" {question}: ").strip()
|
||||
|
||||
|
||||
def prompt_bool(question: str, default: bool = True) -> bool:
|
||||
d = "Y/n" if default else "y/N"
|
||||
val = input(f" {question} [{d}]: ").strip().lower()
|
||||
if not val:
|
||||
return default
|
||||
return val in ("y", "yes", "1", "true")
|
||||
|
||||
|
||||
def setup_platform(platform: str) -> dict:
|
||||
print(f"\n── {platform} Setup ─────────────────────────────────────────")
|
||||
cfg: dict = {}
|
||||
|
||||
enabled = prompt_bool(f"Enable {platform}?", True)
|
||||
cfg["enabled"] = enabled
|
||||
if not enabled:
|
||||
return cfg
|
||||
|
||||
print(f"""
|
||||
How to get your cookies:
|
||||
1. Install "Get cookies.txt LOCALLY" browser extension
|
||||
2. Log into {platform.lower()}.com
|
||||
3. Click the extension and export cookies as JSON (or Netscape .txt)
|
||||
4. Save the file anywhere and enter the path below
|
||||
|
||||
OR: let yt-dlp read cookies directly from your browser (Chrome/Firefox)
|
||||
(your browser must be closed or the profile must be accessible)
|
||||
""")
|
||||
|
||||
method = prompt("Cookie method — (1) cookies file (2) browser auto-read", "1")
|
||||
|
||||
if method == "2":
|
||||
browser = prompt("Browser name (chrome / firefox / edge / safari)", "chrome")
|
||||
cfg["cookies_from_browser"] = browser
|
||||
cfg["cookies_file"] = None
|
||||
else:
|
||||
cookies_path = prompt("Path to cookies file (JSON or Netscape txt)", "")
|
||||
cfg["cookies_file"] = cookies_path if cookies_path else None
|
||||
cfg["cookies_from_browser"] = None
|
||||
|
||||
print(f"\n Enter your {platform} collection/saved URLs.")
|
||||
print(" TikTok: Go to your profile → Collections → open a collection → copy URL")
|
||||
print(" Instagram: Go to profile → Saved → open a collection → copy URL")
|
||||
print(" (Enter one per line, blank line when done)\n")
|
||||
|
||||
collections = []
|
||||
while True:
|
||||
url = input(" Collection URL (or press Enter to finish): ").strip()
|
||||
if not url:
|
||||
break
|
||||
if url.startswith("http"):
|
||||
collections.append(url)
|
||||
print(f" Added: {url}")
|
||||
else:
|
||||
print(" ⚠ That doesn't look like a URL, skipping.")
|
||||
|
||||
cfg["collections"] = collections
|
||||
|
||||
cfg["unsave_after_download"] = prompt_bool("Unsave/remove posts after downloading?", True)
|
||||
cfg["headless"] = prompt_bool("Run browser in headless mode (invisible) for unsaving?", False)
|
||||
|
||||
delay_dl = prompt("Seconds to wait between downloads (avoid rate limits)", "2")
|
||||
cfg["delay_between_downloads"] = int(delay_dl) if delay_dl.isdigit() else 2
|
||||
|
||||
delay_un = prompt("Seconds to wait between unsaves", "3")
|
||||
cfg["delay_between_unsaves"] = int(delay_un) if delay_un.isdigit() else 3
|
||||
|
||||
return cfg
|
||||
|
||||
|
||||
def save_config(config: dict):
|
||||
with open(CONFIG_PATH, "w") as f:
|
||||
json.dump(config, f, indent=2)
|
||||
print(f"\n ✓ Config saved to {CONFIG_PATH}")
|
||||
|
||||
|
||||
def print_banner():
|
||||
print("""
|
||||
╔══════════════════════════════════════════════════════════╗
|
||||
║ Social Media Collection Downloader — Setup ║
|
||||
║ TikTok & Instagram → Download → Auto-unsave ║
|
||||
╚══════════════════════════════════════════════════════════╝
|
||||
""")
|
||||
|
||||
|
||||
def main():
|
||||
print_banner()
|
||||
deps_ok = check_dependencies()
|
||||
if not deps_ok:
|
||||
print("\n Please install missing dependencies first, then re-run setup.py")
|
||||
print("\n Quick install:")
|
||||
print(" pip install yt-dlp playwright")
|
||||
print(" playwright install chromium\n")
|
||||
sys.exit(1)
|
||||
|
||||
config = {}
|
||||
config["tiktok"] = setup_platform("TikTok")
|
||||
config["instagram"] = setup_platform("Instagram")
|
||||
|
||||
print("\n── Summary ─────────────────────────────────────────────────")
|
||||
for platform in ["tiktok", "instagram"]:
|
||||
p = config[platform]
|
||||
status = "✓ Enabled" if p.get("enabled") else "✗ Disabled"
|
||||
n = len(p.get("collections", []))
|
||||
print(f" {platform.capitalize()}: {status} | {n} collection(s)")
|
||||
|
||||
if prompt_bool("\n Save this config and run now?", True):
|
||||
save_config(config)
|
||||
print("\n Running downloader...\n")
|
||||
subprocess.run([sys.executable, str(Path(__file__).parent / "downloader.py")])
|
||||
else:
|
||||
save_config(config)
|
||||
print("\n Config saved. Run later with:")
|
||||
print(" python downloader.py\n")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user