-
Notifications
You must be signed in to change notification settings - Fork 45
Expand file tree
/
Copy pathreddit_stash.py
More file actions
117 lines (96 loc) · 4.34 KB
/
Copy pathreddit_stash.py
File metadata and controls
117 lines (96 loc) · 4.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import praw
import configparser
from utils.file_path_validate import validate_and_set_directory
from utils.file_operations import save_user_activity
from utils.env_config import load_config_and_env
from utils.log_utils import load_file_log, save_file_log
from utils.gdpr_processor import process_gdpr_export
from utils.config_validator import validate_configuration
from utils.feature_flags import get_feature_summary
def create_reddit_client():
"""Create a Reddit client from the configured credentials."""
client_id, client_secret, username, password = load_config_and_env()
return praw.Reddit(
client_id=client_id,
client_secret=client_secret,
username=username,
password=password,
user_agent=f'Reddit Saved Saver by /u/{username}'
)
def main():
# Validate configuration before proceeding
print("Validating configuration...")
try:
validation_result = validate_configuration()
# Print warnings if any
if validation_result['warnings']:
print("\nConfiguration Warnings:")
for warning in validation_result['warnings']:
print(f" ⚠ {warning}")
print("✅ Configuration validated successfully")
print(f"📊 {get_feature_summary()}")
except Exception as e:
print(f"❌ Configuration validation failed: {e}")
print("\nFor detailed configuration information, check your settings.ini file.")
return
# Load configuration
config_parser = configparser.ConfigParser()
config_parser.read('settings.ini')
# Fetch settings
unsave_setting = config_parser.getboolean('Settings', 'unsave_after_download', fallback=False)
save_directory = config_parser.get('Settings', 'save_directory', fallback='reddit/')
process_api = config_parser.getboolean('Settings', 'process_api', fallback=True)
process_gdpr = config_parser.getboolean('Settings', 'process_gdpr', fallback=False)
# Validate directory
save_directory = validate_and_set_directory(save_directory)
# Initialize Reddit API connection (only if API processing is needed)
reddit = None
if process_api:
reddit = create_reddit_client()
elif process_gdpr:
# Try to load credentials for GDPR enrichment, but don't fail if missing
try:
reddit = create_reddit_client()
except Exception:
print("No API credentials available. GDPR export will run in CSV-only mode.")
reddit = None
if not process_api and not process_gdpr:
print("Both process_api and process_gdpr are disabled. Nothing to do.")
return
# Load the log file
file_log = load_file_log(save_directory)
# Initialize counters for processed statistics
total_processed = 0
total_skipped = 0
total_size = 0
total_media_size = 0
# Process API accessible items
if process_api:
print("Processing items from Reddit API...")
api_stats = save_user_activity(reddit, save_directory, file_log, unsave=unsave_setting)
total_processed = api_stats[0]
total_skipped = api_stats[1]
total_size = api_stats[2]
total_media_size = api_stats[3] if len(api_stats) > 3 else 0
# Process GDPR export if enabled (works with or without API credentials)
if process_gdpr:
# Initialize tracking sets
existing_files = set(file_log.keys())
created_dirs_cache = set()
print("\nProcessing GDPR export data...")
gdpr_stats = process_gdpr_export(reddit, save_directory, existing_files,
created_dirs_cache, file_log)
total_processed += gdpr_stats[0]
total_skipped += gdpr_stats[1]
total_size += gdpr_stats[2]
# GDPR processing currently doesn't track media downloads separately
# Final save of file log to persist any remaining batched entries
save_file_log(file_log, save_directory)
# Print final statistics with separate storage reporting
print(f"\nProcessing completed. {total_processed} items processed, "
f"{total_skipped} items skipped.")
print(f"Markdown file storage: {total_size / (1024 * 1024):.2f} MB")
print(f"Media file storage: {total_media_size / (1024 * 1024):.2f} MB")
print(f"Total combined storage: {(total_size + total_media_size) / (1024 * 1024):.2f} MB")
if __name__ == "__main__":
main()