310 lines
10 KiB
Python
Executable File
310 lines
10 KiB
Python
Executable File
#!/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()
|