309
setup.py
Executable file
309
setup.py
Executable file
@@ -0,0 +1,309 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Media Downloader Setup Script
|
||||
Prepares the application for installation
|
||||
"""
|
||||
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
from pathlib import Path
|
||||
import shutil
|
||||
|
||||
def create_default_config():
|
||||
"""Create default configuration file"""
|
||||
config = {
|
||||
"instagram": {
|
||||
"enabled": False,
|
||||
"method": "instaloader",
|
||||
"username": "",
|
||||
"password": "",
|
||||
"totp_secret": "",
|
||||
"session_file": "sessions/session-username",
|
||||
"accounts": [],
|
||||
"posts": {
|
||||
"enabled": True,
|
||||
"days_back": 3,
|
||||
"temp_dir": "temp/ig/posts",
|
||||
"destination_path": "/path/to/media/instagram/posts",
|
||||
"extensions": [".jpg", ".jpeg", ".png", ".heic", ".mp4", ".mov"]
|
||||
},
|
||||
"stories": {
|
||||
"enabled": True,
|
||||
"days_back": 3,
|
||||
"temp_dir": "temp/ig/stories",
|
||||
"destination_path": "/path/to/media/instagram/stories",
|
||||
"extensions": [".jpg", ".jpeg", ".png", ".heic", ".mp4", ".mov"]
|
||||
},
|
||||
"reels": {
|
||||
"enabled": True,
|
||||
"days_back": 3,
|
||||
"temp_dir": "temp/ig/reels",
|
||||
"destination_path": "/path/to/media/instagram/reels",
|
||||
"extensions": [".jpg", ".jpeg", ".png", ".heic", ".mp4", ".mov"]
|
||||
},
|
||||
"max_downloads_per_user": 100
|
||||
},
|
||||
"fastdl": {
|
||||
"enabled": True,
|
||||
"high_res": False,
|
||||
"usernames": [],
|
||||
"phrase_search": {
|
||||
"enabled": False,
|
||||
"usernames": [],
|
||||
"phrases": [],
|
||||
"case_sensitive": False,
|
||||
"match_all": False
|
||||
},
|
||||
"check_interval_hours": 4,
|
||||
"run_at_start": True,
|
||||
"posts": {
|
||||
"enabled": False,
|
||||
"days_back": 3,
|
||||
"temp_dir": "temp/fastdl/posts",
|
||||
"destination_path": "/path/to/media/instagram/posts"
|
||||
},
|
||||
"stories": {
|
||||
"enabled": True,
|
||||
"days_back": 3,
|
||||
"temp_dir": "temp/fastdl/stories",
|
||||
"destination_path": "/path/to/media/instagram/stories"
|
||||
},
|
||||
"reels": {
|
||||
"enabled": True,
|
||||
"days_back": 3,
|
||||
"temp_dir": "temp/fastdl/reels",
|
||||
"destination_path": "/path/to/media/instagram/reels"
|
||||
}
|
||||
},
|
||||
"imginn": {
|
||||
"enabled": True,
|
||||
"usernames": [],
|
||||
"phrase_search": {
|
||||
"enabled": False,
|
||||
"usernames": [],
|
||||
"phrases": [],
|
||||
"case_sensitive": False,
|
||||
"match_all": False
|
||||
},
|
||||
"cookie_file": "cookies/imginn_cookies.json",
|
||||
"check_interval_hours": 4,
|
||||
"run_at_start": True,
|
||||
"posts": {
|
||||
"enabled": False,
|
||||
"days_back": 3,
|
||||
"temp_dir": "temp/imginn/posts",
|
||||
"destination_path": "/path/to/media/instagram/posts"
|
||||
},
|
||||
"stories": {
|
||||
"enabled": False,
|
||||
"days_back": 3,
|
||||
"temp_dir": "temp/imginn/stories",
|
||||
"destination_path": "/path/to/media/instagram/stories"
|
||||
},
|
||||
"tagged": {
|
||||
"enabled": True,
|
||||
"days_back": 7,
|
||||
"temp_dir": "temp/imginn/tagged",
|
||||
"destination_path": "/path/to/media/instagram/tagged"
|
||||
}
|
||||
},
|
||||
"toolzu": {
|
||||
"enabled": False,
|
||||
"usernames": [],
|
||||
"email": "",
|
||||
"password": "",
|
||||
"cookie_file": "cookies/toolzu_cookies.json",
|
||||
"check_interval_hours": 4,
|
||||
"run_at_start": True,
|
||||
"posts": {
|
||||
"enabled": False,
|
||||
"days_back": 3,
|
||||
"temp_dir": "temp/toolzu/posts",
|
||||
"destination_path": "/path/to/media/instagram/posts"
|
||||
},
|
||||
"stories": {
|
||||
"enabled": True,
|
||||
"days_back": 3,
|
||||
"temp_dir": "temp/toolzu/stories",
|
||||
"destination_path": "/path/to/media/instagram/stories"
|
||||
}
|
||||
},
|
||||
"snapchat": {
|
||||
"enabled": False,
|
||||
"check_interval_hours": 4,
|
||||
"cookie_file": "cookies/snapchat_cookies.json",
|
||||
"usernames": [],
|
||||
"run_at_start": True,
|
||||
"stories": {
|
||||
"enabled": True,
|
||||
"days_back": 3,
|
||||
"max_downloads": 50,
|
||||
"temp_dir": "temp/snapchat/stories",
|
||||
"destination_path": "/path/to/media/snapchat/stories"
|
||||
}
|
||||
},
|
||||
"tiktok": {
|
||||
"enabled": True,
|
||||
"accounts": [],
|
||||
"full_profile": False,
|
||||
"days_back": 3,
|
||||
"temp_dir": "temp/tiktok",
|
||||
"destination_path": "/path/to/media/tiktok",
|
||||
"extensions": [".mp4", ".webm", ".m4a", ".mp3", ".mov"]
|
||||
},
|
||||
"forums": {
|
||||
"enabled": False,
|
||||
"headless": True,
|
||||
"configs": []
|
||||
},
|
||||
"download_settings": {
|
||||
"output_dir": "downloads",
|
||||
"use_temp_dir": True,
|
||||
"move_to_destination": True,
|
||||
"rate_limit": 50,
|
||||
"min_delay": 5,
|
||||
"max_delay": 10,
|
||||
"show_debug": False
|
||||
},
|
||||
"immich": {
|
||||
"enabled": False,
|
||||
"api_url": "http://localhost:2283/api",
|
||||
"api_key": "your-api-key-here",
|
||||
"library_id": "",
|
||||
"scan_after_download": True,
|
||||
"scan_at_end": False
|
||||
},
|
||||
"pushover": {
|
||||
"enabled": False,
|
||||
"user_key": "",
|
||||
"api_token": "",
|
||||
"priority": 0,
|
||||
"device": "",
|
||||
"include_image": True
|
||||
},
|
||||
"scheduler": {
|
||||
"module_run_order": ["imginn", "fastdl", "toolzu", "snapchat", "tiktok", "forums"]
|
||||
}
|
||||
}
|
||||
|
||||
return config
|
||||
|
||||
def setup():
|
||||
"""Run setup process"""
|
||||
print("Media Downloader Setup")
|
||||
print("======================")
|
||||
print()
|
||||
|
||||
# Check Python version
|
||||
if sys.version_info < (3, 7):
|
||||
print("Error: Python 3.7 or higher is required")
|
||||
sys.exit(1)
|
||||
|
||||
# Create config directory
|
||||
config_dir = Path("config")
|
||||
config_dir.mkdir(exist_ok=True)
|
||||
|
||||
config_file = config_dir / "settings.json"
|
||||
|
||||
# Create config if it doesn't exist
|
||||
if not config_file.exists():
|
||||
print("Creating default configuration...")
|
||||
config = create_default_config()
|
||||
|
||||
# Interactive setup
|
||||
print("\nQuick Setup (you can edit config/settings.json later)")
|
||||
print("=" * 50)
|
||||
|
||||
# Instagram username
|
||||
if input("\nConfigure Instagram downloads? (y/n): ").lower() == 'y':
|
||||
username = input("Enter Instagram username to download: ").strip()
|
||||
if username:
|
||||
config["fastdl"]["usernames"] = [username]
|
||||
config["imginn"]["usernames"] = [username]
|
||||
|
||||
# TikTok
|
||||
if input("\nConfigure TikTok downloads? (y/n): ").lower() == 'y':
|
||||
username = input("Enter TikTok username: ").strip()
|
||||
if username:
|
||||
config["tiktok"]["accounts"] = [{
|
||||
"username": username,
|
||||
"check_interval_hours": 4,
|
||||
"run_at_start": True
|
||||
}]
|
||||
|
||||
# Destination paths
|
||||
if input("\nSet custom destination paths? (y/n): ").lower() == 'y':
|
||||
base_path = input("Enter base media path (e.g., /opt/immich/media): ").strip()
|
||||
if base_path:
|
||||
# Update all destination paths
|
||||
config["fastdl"]["stories"]["destination_path"] = f"{base_path}/instagram/stories"
|
||||
config["fastdl"]["reels"]["destination_path"] = f"{base_path}/instagram/reels"
|
||||
config["imginn"]["tagged"]["destination_path"] = f"{base_path}/instagram/tagged"
|
||||
config["tiktok"]["destination_path"] = f"{base_path}/tiktok"
|
||||
|
||||
# Immich
|
||||
if input("\nConfigure Immich integration? (y/n): ").lower() == 'y':
|
||||
config["immich"]["enabled"] = True
|
||||
api_url = input(f"Immich API URL [{config['immich']['api_url']}]: ").strip()
|
||||
if api_url:
|
||||
config["immich"]["api_url"] = api_url
|
||||
api_key = input("Immich API key: ").strip()
|
||||
if api_key:
|
||||
config["immich"]["api_key"] = api_key
|
||||
library_id = input("Immich Library ID (optional): ").strip()
|
||||
if library_id:
|
||||
config["immich"]["library_id"] = library_id
|
||||
|
||||
# Pushover
|
||||
if input("\nConfigure Pushover notifications? (y/n): ").lower() == 'y':
|
||||
config["pushover"]["enabled"] = True
|
||||
user_key = input("Pushover user key: ").strip()
|
||||
if user_key:
|
||||
config["pushover"]["user_key"] = user_key
|
||||
api_token = input("Pushover API token: ").strip()
|
||||
if api_token:
|
||||
config["pushover"]["api_token"] = api_token
|
||||
|
||||
# Save config
|
||||
with open(config_file, "w") as f:
|
||||
json.dump(config, f, indent=2)
|
||||
print(f"\nConfiguration saved to {config_file}")
|
||||
else:
|
||||
print(f"Configuration file already exists: {config_file}")
|
||||
|
||||
# Create required directories
|
||||
print("\nCreating required directories...")
|
||||
dirs = ["logs", "temp", "database", "cookies", "sessions"]
|
||||
for d in dirs:
|
||||
Path(d).mkdir(exist_ok=True)
|
||||
print(f" - {d}/")
|
||||
|
||||
# Check for session files
|
||||
session_dir = Path("sessions")
|
||||
if session_dir.exists() and list(session_dir.glob("*")):
|
||||
print(f"\nFound Instagram sessions in {session_dir}")
|
||||
else:
|
||||
print("\nNo Instagram sessions found")
|
||||
print("For Instagram session-based downloads, place session files in sessions/")
|
||||
|
||||
# Make scripts executable
|
||||
scripts = ["media-downloader.py", "db"]
|
||||
for script in scripts:
|
||||
if Path(script).exists():
|
||||
os.chmod(script, 0o755)
|
||||
|
||||
if Path("scripts/install.sh").exists():
|
||||
os.chmod("scripts/install.sh", 0o755)
|
||||
if Path("scripts/uninstall.sh").exists():
|
||||
os.chmod("scripts/uninstall.sh", 0o755)
|
||||
|
||||
print("\nSetup complete!")
|
||||
print("\nNext steps:")
|
||||
print("1. Edit config/settings.json to customize your configuration")
|
||||
print("2. For production install: sudo ./scripts/install.sh")
|
||||
print("3. For testing: python3 media-downloader.py --test")
|
||||
print()
|
||||
|
||||
if __name__ == "__main__":
|
||||
setup()
|
||||
Reference in New Issue
Block a user