138
wrappers/imginn_api_subprocess_wrapper.py
Normal file
138
wrappers/imginn_api_subprocess_wrapper.py
Normal file
@@ -0,0 +1,138 @@
|
||||
#!/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)
|
||||
Reference in New Issue
Block a user