Files
media-downloader/wrappers/imginn_api_subprocess_wrapper.py
Todd 0d7b2b1aab Initial commit
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-29 22:42:55 -04:00

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)