139 lines
4.5 KiB
Python
139 lines
4.5 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Subprocess wrapper for ImgInn API-based operations.
|
|
Uses the API-based module instead of DOM scraping.
|
|
|
|
Supports both single content_type (backward compatible) and multi content_types mode.
|
|
"""
|
|
|
|
import sys
|
|
import json
|
|
from pathlib import Path
|
|
|
|
# Add parent directory to path
|
|
sys.path.insert(0, str(Path(__file__).parent.parent))
|
|
|
|
from wrappers.base_subprocess_wrapper import (
|
|
create_download_wrapper, setup_signal_handlers, set_database_reference,
|
|
stderr_log
|
|
)
|
|
|
|
|
|
def create_imginn_api_downloader(config, unified_db):
|
|
"""Factory function to create an ImgInn API downloader instance."""
|
|
from modules.imginn_api_module import ImgInnAPIDownloader
|
|
|
|
return ImgInnAPIDownloader(
|
|
headless=config.get('headless', True),
|
|
show_progress=True,
|
|
use_database=True,
|
|
log_callback=None,
|
|
unified_db=unified_db
|
|
)
|
|
|
|
|
|
# Create the single-content download function using the factory
|
|
run_imginn_api_download = create_download_wrapper("ImgInnAPI", "imginn_api", create_imginn_api_downloader)
|
|
|
|
|
|
def run_imginn_api_download_multi(config: dict) -> dict:
|
|
"""Run multi-content-type download by calling download() for each content type."""
|
|
from modules.unified_database import UnifiedDatabase
|
|
from modules.monitor_wrapper import log_download_result
|
|
|
|
setup_signal_handlers("ImgInnAPI")
|
|
|
|
required_keys = ['username', 'content_types', 'output_dirs']
|
|
missing_keys = [key for key in required_keys if key not in config]
|
|
if missing_keys:
|
|
return {'status': 'error', 'message': f'Missing required config keys: {missing_keys}', 'results': {}}
|
|
|
|
db_path = config.get('db_path', '/opt/media-downloader/database/media_downloader.db')
|
|
unified_db = UnifiedDatabase(db_path, use_pool=False)
|
|
set_database_reference(unified_db)
|
|
|
|
try:
|
|
downloader = create_imginn_api_downloader(config, unified_db)
|
|
|
|
username = config['username']
|
|
content_types = config['content_types']
|
|
output_dirs = config['output_dirs']
|
|
|
|
stderr_log(f"Processing Instagram multi ({', '.join(content_types)}) for @{username}", "info")
|
|
|
|
# Create temp directories
|
|
for ct, dir_path in output_dirs.items():
|
|
Path(dir_path).mkdir(parents=True, exist_ok=True)
|
|
|
|
results = {}
|
|
total_count = 0
|
|
|
|
for ct in content_types:
|
|
output_dir = output_dirs.get(ct)
|
|
if not output_dir:
|
|
results[ct] = {'count': 0, 'pending_downloads': []}
|
|
continue
|
|
|
|
try:
|
|
count = downloader.download(
|
|
username=username,
|
|
content_type=ct,
|
|
days_back=config.get('days_back', 3),
|
|
max_downloads=config.get('max_downloads', 50),
|
|
output_dir=output_dir,
|
|
phrase_config=config.get('phrase_config'),
|
|
defer_database=True
|
|
)
|
|
|
|
pending_downloads = downloader.get_pending_downloads()
|
|
downloader.clear_pending_downloads()
|
|
|
|
results[ct] = {
|
|
'count': count or 0,
|
|
'pending_downloads': pending_downloads
|
|
}
|
|
total_count += count or 0
|
|
|
|
except Exception as e:
|
|
stderr_log(f"ImgInn API download error for {ct}: {e}", "error")
|
|
import traceback
|
|
stderr_log(traceback.format_exc(), "error")
|
|
results[ct] = {'count': 0, 'pending_downloads': []}
|
|
|
|
log_download_result("imginn_api", username, total_count, error=None)
|
|
|
|
return {
|
|
'status': 'success',
|
|
'results': results
|
|
}
|
|
|
|
except Exception as e:
|
|
stderr_log(f"ImgInn API multi-download error: {e}", "error")
|
|
import traceback
|
|
stderr_log(traceback.format_exc(), "error")
|
|
log_download_result("imginn_api", config.get('username', ''), 0, error=str(e))
|
|
return {
|
|
'status': 'error',
|
|
'message': str(e),
|
|
'results': {}
|
|
}
|
|
finally:
|
|
if unified_db:
|
|
try:
|
|
unified_db.close()
|
|
except Exception:
|
|
pass
|
|
|
|
|
|
if __name__ == '__main__':
|
|
config_json = sys.stdin.read()
|
|
config = json.loads(config_json)
|
|
|
|
if 'content_types' in config:
|
|
result = run_imginn_api_download_multi(config)
|
|
else:
|
|
result = run_imginn_api_download(config)
|
|
|
|
print(json.dumps(result))
|
|
sys.exit(0 if result.get('status') == 'success' else 1)
|