epstein-files 1.0.6__tar.gz → 1.0.8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {epstein_files-1.0.6 → epstein_files-1.0.8}/PKG-INFO +17 -11
- {epstein_files-1.0.6 → epstein_files-1.0.8}/README.md +15 -10
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/documents/email.py +4 -3
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/util/constant/names.py +2 -2
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/util/env.py +18 -18
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/util/logging.py +5 -3
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/util/output.py +3 -1
- {epstein_files-1.0.6 → epstein_files-1.0.8}/pyproject.toml +2 -1
- {epstein_files-1.0.6 → epstein_files-1.0.8}/LICENSE +0 -0
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/__init__.py +0 -0
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/count_words.py +0 -0
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/documents/communication.py +0 -0
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/documents/document.py +0 -0
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/documents/emails/email_header.py +0 -0
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/documents/imessage/text_message.py +0 -0
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/documents/json_file.py +0 -0
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/documents/messenger_log.py +0 -0
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/documents/other_file.py +0 -0
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/epstein_files.py +0 -0
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/util/constant/common_words.py +0 -0
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/util/constant/html.py +0 -0
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/util/constant/output_files.py +0 -0
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/util/constant/strings.py +0 -0
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/util/constant/urls.py +0 -0
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/util/constants.py +0 -0
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/util/data.py +0 -0
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/util/doc_cfg.py +0 -0
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/util/file_helper.py +0 -0
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/util/highlighted_group.py +0 -0
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/util/rich.py +0 -0
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/util/search_result.py +0 -0
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/util/timer.py +0 -0
- {epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/util/word_count.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: epstein-files
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.8
|
|
4
4
|
Summary: Tools for working with the Jeffrey Epstein documents released in November 2025.
|
|
5
5
|
Home-page: https://michelcrypt4d4mus.github.io/epstein_text_messages/
|
|
6
6
|
License: GPL-3.0-or-later
|
|
@@ -23,6 +23,7 @@ Requires-Dist: python-dateutil (>=2.9.0.post0,<3.0.0)
|
|
|
23
23
|
Requires-Dist: python-dotenv (>=1.2.1,<2.0.0)
|
|
24
24
|
Requires-Dist: requests (>=2.32.5,<3.0.0)
|
|
25
25
|
Requires-Dist: rich (>=14.2.0,<15.0.0)
|
|
26
|
+
Requires-Dist: rich-argparse-plus (>=0.3.1.4,<0.4.0.0)
|
|
26
27
|
Project-URL: Emails, https://michelcrypt4d4mus.github.io/epstein_text_messages/all_emails_epstein_files_nov_2025.html
|
|
27
28
|
Project-URL: Metadata, https://michelcrypt4d4mus.github.io/epstein_text_messages/file_metadata_epstein_files_nov_2025.json
|
|
28
29
|
Project-URL: Repository, https://github.com/michelcrypt4d4mus/epstein_text_messages
|
|
@@ -32,19 +33,20 @@ Description-Content-Type: text/markdown
|
|
|
32
33
|
|
|
33
34
|
# I Made Epstein's Text Messages Great Again
|
|
34
35
|
|
|
35
|
-

|
|
36
37
|
|
|
37
|
-
*
|
|
38
|
-
* The Epstein text messages (and some of the emails along with summary information) generated by this code can be viewed [here](https://michelcrypt4d4mus.github.io/epstein_text_messages/).
|
|
38
|
+
* The Epstein text messages (and selected emails and other files) generated by this code can be viewed [here](https://michelcrypt4d4mus.github.io/epstein_text_messages/).
|
|
39
39
|
* All of His Emails along with descriptions of the 496 files that were neither emails nor text messages can be read at [another page also generated by this code](https://michelcrypt4d4mus.github.io/epstein_text_messages/all_emails_epstein_files_nov_2025.html).
|
|
40
|
-
* Word counts for the communications
|
|
40
|
+
* [Word counts for all of the communications](https://michelcrypt4d4mus.github.io/epstein_text_messages/communication_word_count_epstein_files_nov_2025.html).
|
|
41
41
|
* Metadata containing what I have figured out about who sent or received the communications in a given file (and a brief explanation for how I figured it out for each file) is deployed [here](https://michelcrypt4d4mus.github.io/epstein_text_messages/file_metadata_epstein_files_nov_2025.json)
|
|
42
|
-
*
|
|
42
|
+
* [I Made Epstein's Text Messages Great Again (And You Should Read Them)](https://cryptadamus.substack.com/p/i-made-epsteins-text-messages-great) post on [Substack](https://cryptadamus.substack.com/p/i-made-epsteins-text-messages-great)
|
|
43
43
|
|
|
44
44
|
|
|
45
45
|
## Usage
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
|
|
47
|
+
#### Installation
|
|
48
|
+
1. Requires you have a local copy of the OCR text files from the House Oversight document release in a directory `/path/to/epstein/ocr_txt_files`. You can download those OCR text files from [the Congressional Google Drive folder](https://drive.google.com/drive/folders/1ldncvdqIf6miiskDp_EDuGSDAaI_fJx8) (make sure you grab both the `001/` and `002/` folders).
|
|
49
|
+
1. Use `poetry install` for easiest time installing. `pip install epstein-files` should also work, though `pipx install epstein-files` is usually better.
|
|
48
50
|
|
|
49
51
|
You need to set the `EPSTEIN_DOCS_DIR` environment variable with the path to the folder of files you just downloaded when running. You can either create a `.env` file modeled on [`.env.example`](./.env.example) (which will set it permanently) or you can run with:
|
|
50
52
|
|
|
@@ -63,11 +65,11 @@ epstein_search Bannon
|
|
|
63
65
|
# Or a regex:
|
|
64
66
|
epstein_search '\bSteve\s*Bannon\b'
|
|
65
67
|
|
|
66
|
-
# Show a file with color highlighting of keywords
|
|
68
|
+
# Show a file with color highlighting of keywords:
|
|
67
69
|
epstein_show 030999
|
|
68
70
|
# Show both the highlighted and raw versions of the file:
|
|
69
71
|
epstein_show --raw 030999
|
|
70
|
-
#
|
|
72
|
+
# The full filename is also accepted:
|
|
71
73
|
epstein_show HOUSE_OVERSIGHT_030999
|
|
72
74
|
|
|
73
75
|
# Count words used by Epstein and Bannon
|
|
@@ -77,7 +79,7 @@ epstein_word_count --name 'Jeffrey Epstein' --name 'Steve Bannon'
|
|
|
77
79
|
epstein_diff 030999 020442
|
|
78
80
|
```
|
|
79
81
|
|
|
80
|
-
The first time you run anything it will take a few minutes to fix all the
|
|
82
|
+
The first time you run anything it will take a few minutes to fix all the janky OCR text, attribute the redacted emails, etc. After that things will be quick.
|
|
81
83
|
Run `epstein_generate --help` for command line option assistance.
|
|
82
84
|
|
|
83
85
|
|
|
@@ -98,6 +100,10 @@ for email in epstein_files.emails:
|
|
|
98
100
|
for imessage_log in epstein_files.imessage_logs:
|
|
99
101
|
do_stuff(imessage_log)
|
|
100
102
|
|
|
103
|
+
# JSON files
|
|
104
|
+
for json_file in epstein_files.json_files:
|
|
105
|
+
do_stuff(json_file)
|
|
106
|
+
|
|
101
107
|
# Other Files
|
|
102
108
|
for file in epstein_files.other_files:
|
|
103
109
|
do_stuff(file)
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
# I Made Epstein's Text Messages Great Again
|
|
2
2
|
|
|
3
|
-

|
|
4
4
|
|
|
5
|
-
*
|
|
6
|
-
* The Epstein text messages (and some of the emails along with summary information) generated by this code can be viewed [here](https://michelcrypt4d4mus.github.io/epstein_text_messages/).
|
|
5
|
+
* The Epstein text messages (and selected emails and other files) generated by this code can be viewed [here](https://michelcrypt4d4mus.github.io/epstein_text_messages/).
|
|
7
6
|
* All of His Emails along with descriptions of the 496 files that were neither emails nor text messages can be read at [another page also generated by this code](https://michelcrypt4d4mus.github.io/epstein_text_messages/all_emails_epstein_files_nov_2025.html).
|
|
8
|
-
* Word counts for the communications
|
|
7
|
+
* [Word counts for all of the communications](https://michelcrypt4d4mus.github.io/epstein_text_messages/communication_word_count_epstein_files_nov_2025.html).
|
|
9
8
|
* Metadata containing what I have figured out about who sent or received the communications in a given file (and a brief explanation for how I figured it out for each file) is deployed [here](https://michelcrypt4d4mus.github.io/epstein_text_messages/file_metadata_epstein_files_nov_2025.json)
|
|
10
|
-
*
|
|
9
|
+
* [I Made Epstein's Text Messages Great Again (And You Should Read Them)](https://cryptadamus.substack.com/p/i-made-epsteins-text-messages-great) post on [Substack](https://cryptadamus.substack.com/p/i-made-epsteins-text-messages-great)
|
|
11
10
|
|
|
12
11
|
|
|
13
12
|
## Usage
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
|
|
14
|
+
#### Installation
|
|
15
|
+
1. Requires you have a local copy of the OCR text files from the House Oversight document release in a directory `/path/to/epstein/ocr_txt_files`. You can download those OCR text files from [the Congressional Google Drive folder](https://drive.google.com/drive/folders/1ldncvdqIf6miiskDp_EDuGSDAaI_fJx8) (make sure you grab both the `001/` and `002/` folders).
|
|
16
|
+
1. Use `poetry install` for easiest time installing. `pip install epstein-files` should also work, though `pipx install epstein-files` is usually better.
|
|
16
17
|
|
|
17
18
|
You need to set the `EPSTEIN_DOCS_DIR` environment variable with the path to the folder of files you just downloaded when running. You can either create a `.env` file modeled on [`.env.example`](./.env.example) (which will set it permanently) or you can run with:
|
|
18
19
|
|
|
@@ -31,11 +32,11 @@ epstein_search Bannon
|
|
|
31
32
|
# Or a regex:
|
|
32
33
|
epstein_search '\bSteve\s*Bannon\b'
|
|
33
34
|
|
|
34
|
-
# Show a file with color highlighting of keywords
|
|
35
|
+
# Show a file with color highlighting of keywords:
|
|
35
36
|
epstein_show 030999
|
|
36
37
|
# Show both the highlighted and raw versions of the file:
|
|
37
38
|
epstein_show --raw 030999
|
|
38
|
-
#
|
|
39
|
+
# The full filename is also accepted:
|
|
39
40
|
epstein_show HOUSE_OVERSIGHT_030999
|
|
40
41
|
|
|
41
42
|
# Count words used by Epstein and Bannon
|
|
@@ -45,7 +46,7 @@ epstein_word_count --name 'Jeffrey Epstein' --name 'Steve Bannon'
|
|
|
45
46
|
epstein_diff 030999 020442
|
|
46
47
|
```
|
|
47
48
|
|
|
48
|
-
The first time you run anything it will take a few minutes to fix all the
|
|
49
|
+
The first time you run anything it will take a few minutes to fix all the janky OCR text, attribute the redacted emails, etc. After that things will be quick.
|
|
49
50
|
Run `epstein_generate --help` for command line option assistance.
|
|
50
51
|
|
|
51
52
|
|
|
@@ -66,6 +67,10 @@ for email in epstein_files.emails:
|
|
|
66
67
|
for imessage_log in epstein_files.imessage_logs:
|
|
67
68
|
do_stuff(imessage_log)
|
|
68
69
|
|
|
70
|
+
# JSON files
|
|
71
|
+
for json_file in epstein_files.json_files:
|
|
72
|
+
do_stuff(json_file)
|
|
73
|
+
|
|
69
74
|
# Other Files
|
|
70
75
|
for file in epstein_files.other_files:
|
|
71
76
|
do_stuff(file)
|
|
@@ -38,7 +38,6 @@ TIMESTAMP_LINE_REGEX = re.compile(r"\d+:\d+")
|
|
|
38
38
|
|
|
39
39
|
SUPPRESS_LOGS_FOR_AUTHORS = ['Undisclosed recipients:', 'undisclosed-recipients:', 'Multiple Senders Multiple Senders']
|
|
40
40
|
REWRITTEN_HEADER_MSG = "(janky OCR header fields were prettified, check source if something seems off)"
|
|
41
|
-
IS_JUNK_MAIL = 'is_junk_mail'
|
|
42
41
|
MAX_CHARS_TO_PRINT = 4000
|
|
43
42
|
MAX_NUM_HEADER_LINES = 14
|
|
44
43
|
MAX_QUOTED_REPLIES = 2
|
|
@@ -289,9 +288,10 @@ SELF_EMAILS_FILE_IDS = [
|
|
|
289
288
|
]
|
|
290
289
|
|
|
291
290
|
METADATA_FIELDS = [
|
|
292
|
-
|
|
291
|
+
'is_junk_mail',
|
|
293
292
|
'recipients',
|
|
294
293
|
'sent_from_device',
|
|
294
|
+
'subject',
|
|
295
295
|
]
|
|
296
296
|
|
|
297
297
|
|
|
@@ -352,7 +352,8 @@ class Email(Communication):
|
|
|
352
352
|
|
|
353
353
|
def metadata(self) -> Metadata:
|
|
354
354
|
local_metadata = asdict(self)
|
|
355
|
-
local_metadata[
|
|
355
|
+
local_metadata['is_junk_mail'] = self.is_junk_mail()
|
|
356
|
+
local_metadata['subject'] = self.subject() or None
|
|
356
357
|
metadata = super().metadata()
|
|
357
358
|
metadata.update({k: v for k, v in local_metadata.items() if v and k in METADATA_FIELDS})
|
|
358
359
|
return metadata
|
|
@@ -205,12 +205,12 @@ NAMES_TO_NOT_HIGHLIGHT: list[str] = [name.lower() for name in [
|
|
|
205
205
|
'Carolyn', 'Chris', 'Christina',
|
|
206
206
|
'Dan', 'Daniel', 'Danny', 'Darren', 'Dave', 'David',
|
|
207
207
|
'Ed', 'Edward', 'Edwards', 'Epstein', 'Eric', 'Erika', 'Etienne',
|
|
208
|
-
'Faith', 'Fred', 'Frost', 'Fuller',
|
|
208
|
+
'Faith', 'Fred', 'Friendly', 'Frost', 'Fuller',
|
|
209
209
|
'George',
|
|
210
210
|
'Heather', 'Henry', 'Hill', 'Hoffman',
|
|
211
211
|
'Ian',
|
|
212
212
|
'Jack', 'James', 'Jay', 'Jean', 'Jeff', 'Jeffrey', 'Jennifer', 'Jeremy', 'jessica', 'Joel', 'John', 'Jon', 'Jonathan', 'Joseph', 'Jr',
|
|
213
|
-
'Kahn', 'Katherine', 'Ken', 'Kevin',
|
|
213
|
+
'Kahn', 'Katherine', 'Kelly', 'Ken', 'Kevin',
|
|
214
214
|
'Larry', 'Leon', 'Lesley', 'Linda', 'Link', 'Lisa',
|
|
215
215
|
'Mann', 'Marc', 'Marie', 'Mark', 'Martin', 'Melanie', 'Michael', 'Mike', 'Miller', 'Mitchell', 'Miles', 'Morris', 'Moskowitz',
|
|
216
216
|
'Nancy', 'Neal', 'New',
|
|
@@ -4,42 +4,44 @@ from os import environ
|
|
|
4
4
|
from pathlib import Path
|
|
5
5
|
from sys import argv
|
|
6
6
|
|
|
7
|
-
from
|
|
7
|
+
from rich_argparse_plus import RichHelpFormatterPlus
|
|
8
|
+
|
|
9
|
+
from epstein_files.util.logging import env_log_level, logger
|
|
8
10
|
|
|
9
11
|
COUNT_WORDS_SCRIPT = 'epstein_word_count'
|
|
10
12
|
DEFAULT_WIDTH = 145
|
|
11
13
|
HTML_SCRIPTS = ['epstein_generate', COUNT_WORDS_SCRIPT]
|
|
12
14
|
|
|
13
|
-
|
|
14
|
-
parser = ArgumentParser(description="Parse epstein OCR docs and generate HTML
|
|
15
|
+
RichHelpFormatterPlus.choose_theme('morning_glory')
|
|
16
|
+
parser = ArgumentParser(description="Parse epstein OCR docs and generate HTML pages.", formatter_class=RichHelpFormatterPlus)
|
|
15
17
|
parser.add_argument('--name', '-n', action='append', dest='names', help='specify the name(s) whose communications should be output')
|
|
16
18
|
parser.add_argument('--overwrite-pickle', '-op', action='store_true', help='ovewrite cached EpsteinFiles')
|
|
17
19
|
|
|
18
20
|
output = parser.add_argument_group('OUTPUT')
|
|
19
21
|
output.add_argument('--all-emails', '-ae', action='store_true', help='all the emails instead of just the interesting ones')
|
|
20
22
|
output.add_argument('--all-other-files', '-ao', action='store_true', help='all the non-email, non-text msg files instead of just the interesting ones')
|
|
21
|
-
output.add_argument('--build', '-b', action='store_true', help='write output to HTML file')
|
|
23
|
+
output.add_argument('--build', '-b', action='store_true', help='write output to an HTML file')
|
|
24
|
+
output.add_argument('--json-metadata', '-jm', action='store_true', help='dump JSON metadata for all files and exit')
|
|
22
25
|
output.add_argument('--make-clean', action='store_true', help='delete all HTML build artifact and write latest URLs to .urls.env')
|
|
23
26
|
output.add_argument('--output-emails', '-oe', action='store_true', help='generate other files section')
|
|
24
|
-
output.add_argument('--output-json-files', action='store_true', help='pretty print all the raw JSON data files in the collection')
|
|
27
|
+
output.add_argument('--output-json-files', action='store_true', help='pretty print all the raw JSON data files in the collection and exit')
|
|
25
28
|
output.add_argument('--output-other-files', '-oo', action='store_true', help='generate other files section')
|
|
26
|
-
output.add_argument('--output-texts', '-ot', action='store_true', help='generate
|
|
29
|
+
output.add_argument('--output-texts', '-ot', action='store_true', help='generate text messages section')
|
|
30
|
+
output.add_argument('--sort-alphabetical', action='store_true', help='sort emailers alphabetically intead of by email count')
|
|
27
31
|
output.add_argument('--suppress-output', action='store_true', help='no output to terminal (use with --build)')
|
|
28
32
|
output.add_argument('--width', '-w', type=int, default=DEFAULT_WIDTH, help='screen width to use (in characters)')
|
|
29
33
|
output.add_argument('--use-epstein-web-links', action='store_true', help='use epsteinweb.org links instead of epstein.media')
|
|
30
34
|
|
|
31
35
|
scripts = parser.add_argument_group('SCRIPTS', 'Arguments used only by epstein_search, epstein_show, epstein_diff')
|
|
32
36
|
scripts.add_argument('positional_args', nargs='*', help='strings to searchs for, file IDs to show or diff, etc.')
|
|
33
|
-
scripts.add_argument('--raw', '-r', action='store_true', help='show raw contents of file (
|
|
34
|
-
scripts.add_argument('--whole-file', '-wf', action='store_true', help='print whole file (
|
|
37
|
+
scripts.add_argument('--raw', '-r', action='store_true', help='show raw contents of file (used by epstein_show)')
|
|
38
|
+
scripts.add_argument('--whole-file', '-wf', action='store_true', help='print whole file (used by epstein_search)')
|
|
35
39
|
|
|
36
40
|
debug = parser.add_argument_group('DEBUG')
|
|
37
41
|
debug.add_argument('--colors-only', '-c', action='store_true', help='print header with color key table and links and exit')
|
|
38
42
|
debug.add_argument('--debug', '-d', action='store_true', help='set debug level to INFO')
|
|
39
43
|
debug.add_argument('--deep-debug', '-dd', action='store_true', help='set debug level to DEBUG')
|
|
40
|
-
debug.add_argument('--json-
|
|
41
|
-
debug.add_argument('--json-stats', '-j', action='store_true', help='print JSON formatted stats at the end')
|
|
42
|
-
debug.add_argument('--sort-alphabetical', action='store_true', help='sort emailers alphabetically in counts table')
|
|
44
|
+
debug.add_argument('--json-stats', '-j', action='store_true', help='print JSON formatted stats about the files')
|
|
43
45
|
debug.add_argument('--suppress-logs', '-sl', action='store_true', help='set debug level to FATAL')
|
|
44
46
|
args = parser.parse_args()
|
|
45
47
|
|
|
@@ -52,6 +54,8 @@ args.output_emails = args.output_emails or args.all_emails
|
|
|
52
54
|
args.output_other_files = args.output_other_files or args.all_other_files
|
|
53
55
|
args.overwrite_pickle = args.overwrite_pickle or (is_env_var_set('OVERWRITE_PICKLE') and not is_env_var_set('PICKLED'))
|
|
54
56
|
args.width = args.width if is_html_script else None
|
|
57
|
+
is_output_selected = any([arg.startswith('output_') and value for arg, value in vars(args).items()])
|
|
58
|
+
is_output_selected = is_output_selected or args.json_metadata or args.colors_only
|
|
55
59
|
specified_names: list[str | None] = [None if n == 'None' else n for n in (args.names or [])]
|
|
56
60
|
|
|
57
61
|
|
|
@@ -66,14 +70,10 @@ elif not env_log_level:
|
|
|
66
70
|
logger.setLevel(logging.WARNING)
|
|
67
71
|
|
|
68
72
|
logger.info(f'Log level set to {logger.level}...')
|
|
69
|
-
datefinder_logger.setLevel(logger.level)
|
|
70
|
-
|
|
71
73
|
|
|
72
74
|
# Massage args that depend on other args to the appropriate state
|
|
73
|
-
if
|
|
74
|
-
|
|
75
|
-
logger.warning(f"No output section chosen; outputting default selection of texts, selected emails, and other files...")
|
|
76
|
-
|
|
75
|
+
if current_script == 'epstein_generate' and not (is_output_selected or args.make_clean):
|
|
76
|
+
logger.warning(f"No output section chosen; outputting default selection of texts, selected emails, and other files...")
|
|
77
77
|
args.output_texts = True
|
|
78
78
|
args.output_emails = True
|
|
79
79
|
args.output_other_files = True
|
|
@@ -82,4 +82,4 @@ if args.use_epstein_web_links:
|
|
|
82
82
|
logger.warning(f"Using links to epsteinweb.org links instead of epsteinify.com...")
|
|
83
83
|
|
|
84
84
|
if args.debug:
|
|
85
|
-
logger.warning(f"Invocation args:\ncurrent_script={current_script}\nis_html_script={is_html_script},\nspecified_names={specified_names},\nargs={args}")
|
|
85
|
+
logger.warning(f"Invocation args:\ncurrent_script={current_script}\nis_html_script={is_html_script},\nis_output_selected={is_output_selected}\nspecified_names={specified_names},\nargs={args}")
|
|
@@ -2,6 +2,8 @@ import logging
|
|
|
2
2
|
from os import environ
|
|
3
3
|
from pathlib import Path
|
|
4
4
|
|
|
5
|
+
import datefinder
|
|
6
|
+
from rich_argparse_plus
|
|
5
7
|
from rich.console import Console
|
|
6
8
|
from rich.highlighter import ReprHighlighter
|
|
7
9
|
from rich.logging import RichHandler
|
|
@@ -43,8 +45,9 @@ logging.basicConfig(level="NOTSET", format="%(message)s", datefmt="[%X]", handle
|
|
|
43
45
|
logger = logging.getLogger("rich")
|
|
44
46
|
|
|
45
47
|
|
|
46
|
-
#
|
|
47
|
-
|
|
48
|
+
# Set log levels to suppress annoying output
|
|
49
|
+
logging.getLogger('datefinder').setLevel(logging.FATAL)
|
|
50
|
+
logging.getLogger('rich_argparse').setLevel(logging.FATAL)
|
|
48
51
|
env_log_level_str = environ.get(LOG_LEVEL_ENV_VAR) or None
|
|
49
52
|
env_log_level = None
|
|
50
53
|
|
|
@@ -57,7 +60,6 @@ if env_log_level_str:
|
|
|
57
60
|
|
|
58
61
|
logger.warning(f"Setting log level to {env_log_level} based on {LOG_LEVEL_ENV_VAR} env var...")
|
|
59
62
|
logger.setLevel(env_log_level)
|
|
60
|
-
datefinder_logger.setLevel(env_log_level)
|
|
61
63
|
|
|
62
64
|
|
|
63
65
|
def log_file_write(file_path: str | Path) -> None:
|
|
@@ -105,7 +105,9 @@ def print_emails(epstein_files: EpsteinFiles) -> int:
|
|
|
105
105
|
if args.all_emails:
|
|
106
106
|
_verify_all_emails_were_printed(epstein_files, already_printed_emails)
|
|
107
107
|
|
|
108
|
-
|
|
108
|
+
fwded_articles = [e for e in already_printed_emails if e.config and e.config.is_fwded_article]
|
|
109
|
+
logger.warning(f"{len(fwded_articles)} of {len(already_printed_emails)} emails were forwarded articles.")
|
|
110
|
+
logger.warning(f"Rewrote {len(Email.rewritten_header_ids)} headers of {len(epstein_files.emails)} emails.")
|
|
109
111
|
return len(already_printed_emails)
|
|
110
112
|
|
|
111
113
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "epstein-files"
|
|
3
|
-
version = "1.0.
|
|
3
|
+
version = "1.0.8"
|
|
4
4
|
description = "Tools for working with the Jeffrey Epstein documents released in November 2025."
|
|
5
5
|
authors = ["Michel de Cryptadamus"]
|
|
6
6
|
readme = "README.md"
|
|
@@ -35,6 +35,7 @@ python-dateutil = "^2.9.0.post0"
|
|
|
35
35
|
python-dotenv = "^1.2.1"
|
|
36
36
|
requests = "^2.32.5"
|
|
37
37
|
rich = "^14.2.0"
|
|
38
|
+
rich-argparse-plus = "^0.3.1.4"
|
|
38
39
|
|
|
39
40
|
|
|
40
41
|
[tool.poetry.group.dev.dependencies]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{epstein_files-1.0.6 → epstein_files-1.0.8}/epstein_files/documents/imessage/text_message.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|