epstein-files 1.0.13__py3-none-any.whl → 1.0.14__py3-none-any.whl
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/__init__.py +11 -6
- epstein_files/documents/communication.py +2 -2
- epstein_files/documents/document.py +52 -46
- epstein_files/documents/email.py +32 -29
- epstein_files/documents/imessage/text_message.py +4 -4
- epstein_files/documents/json_file.py +9 -3
- epstein_files/documents/messenger_log.py +20 -17
- epstein_files/documents/other_file.py +50 -71
- epstein_files/epstein_files.py +89 -67
- epstein_files/util/constant/names.py +1 -1
- epstein_files/util/constant/strings.py +1 -1
- epstein_files/util/constants.py +62 -44
- epstein_files/util/data.py +2 -0
- epstein_files/util/doc_cfg.py +7 -7
- epstein_files/util/env.py +2 -5
- epstein_files/util/highlighted_group.py +7 -15
- epstein_files/util/output.py +15 -30
- epstein_files/util/rich.py +29 -29
- epstein_files/util/word_count.py +1 -1
- {epstein_files-1.0.13.dist-info → epstein_files-1.0.14.dist-info}/METADATA +10 -3
- epstein_files-1.0.14.dist-info/RECORD +33 -0
- epstein_files-1.0.13.dist-info/RECORD +0 -33
- {epstein_files-1.0.13.dist-info → epstein_files-1.0.14.dist-info}/LICENSE +0 -0
- {epstein_files-1.0.13.dist-info → epstein_files-1.0.14.dist-info}/WHEEL +0 -0
- {epstein_files-1.0.13.dist-info → epstein_files-1.0.14.dist-info}/entry_points.txt +0 -0
epstein_files/util/rich.py
CHANGED
|
@@ -102,8 +102,13 @@ def build_highlighter(pattern: str) -> EpsteinHighlighter:
|
|
|
102
102
|
return TempHighlighter()
|
|
103
103
|
|
|
104
104
|
|
|
105
|
-
def build_table(title: str | None, **kwargs) -> Table:
|
|
106
|
-
|
|
105
|
+
def build_table(title: str | None, cols: list[str | dict] | None = None, **kwargs) -> Table:
|
|
106
|
+
table = Table(title=title, **{**DEFAULT_TABLE_KWARGS, **kwargs})
|
|
107
|
+
|
|
108
|
+
if cols:
|
|
109
|
+
add_cols_to_table(table, cols)
|
|
110
|
+
|
|
111
|
+
return table
|
|
107
112
|
|
|
108
113
|
|
|
109
114
|
def join_texts(txts: list[Text], join: str = ' ', encloser: str = '', encloser_style: str = 'wheat4') -> Text:
|
|
@@ -138,6 +143,13 @@ def parenthesize(msg: str | Text, style: str = '') -> Text:
|
|
|
138
143
|
return Text('(', style=style).append(txt).append(')')
|
|
139
144
|
|
|
140
145
|
|
|
146
|
+
def print_all_files_page_link(epstein_files: 'EpsteinFiles') -> None:
|
|
147
|
+
markup_msg = link_markup(SITE_URLS[EMAIL], 'the other page', style='light_slate_grey bold')
|
|
148
|
+
txt = Text.from_markup(markup_msg).append(f' is uncurated and has all {len(epstein_files.other_files)}')
|
|
149
|
+
txt.append(f" unclassifiable files and {len(epstein_files.emails):,} emails")
|
|
150
|
+
print_centered(parenthesize(txt), style='dim')
|
|
151
|
+
|
|
152
|
+
|
|
141
153
|
def print_author_header(msg: str, color: str | None, footer: str | None = None) -> None:
|
|
142
154
|
txt = Text(msg, justify='center')
|
|
143
155
|
color = color or 'white'
|
|
@@ -183,7 +195,20 @@ def print_header(epstein_files: 'EpsteinFiles') -> None:
|
|
|
183
195
|
|
|
184
196
|
console.print(f"{not_optimized_msg}.\n", style='dim')
|
|
185
197
|
print_page_title(width=TITLE_WIDTH)
|
|
186
|
-
|
|
198
|
+
site_type: SiteType = EMAIL if args.all_emails else TEXT_MESSAGE
|
|
199
|
+
print_starred_header(f"This is the Epstein {site_type.title()}s site", num_spaces=4, num_stars=14)
|
|
200
|
+
other_site_type: SiteType = TEXT_MESSAGE if site_type == EMAIL else EMAIL
|
|
201
|
+
other_site_msg = "another site with" + (' all of' if other_site_type == EMAIL else '')
|
|
202
|
+
other_site_msg += f" Epstein's {other_site_type}s also generated by this code"
|
|
203
|
+
|
|
204
|
+
markup_msg = link_markup(SITE_URLS[other_site_type], other_site_msg, OTHER_SITE_LINK_STYLE)
|
|
205
|
+
print_centered(parenthesize(Text.from_markup(markup_msg)), style='bold')
|
|
206
|
+
word_count_link = link_text_obj(WORD_COUNT_URL, 'most frequently used words in the emails and texts', AUX_SITE_LINK_STYLE)
|
|
207
|
+
print_centered(parenthesize(word_count_link))
|
|
208
|
+
metadata_link = link_text_obj(JSON_METADATA_URL, 'author attribution explanations', AUX_SITE_LINK_STYLE)
|
|
209
|
+
print_centered(parenthesize(metadata_link))
|
|
210
|
+
json_link = link_text_obj(WORD_COUNT_URL, "epstein's json files", AUX_SITE_LINK_STYLE)
|
|
211
|
+
print_centered(parenthesize(json_link))
|
|
187
212
|
_print_external_links()
|
|
188
213
|
console.line()
|
|
189
214
|
_print_abbreviations_table()
|
|
@@ -247,31 +272,6 @@ def print_numbered_list_of_emailers(_list: list[str | None], epstein_files = Non
|
|
|
247
272
|
console.line()
|
|
248
273
|
|
|
249
274
|
|
|
250
|
-
def print_other_site_link(is_header: bool = True) -> None:
|
|
251
|
-
"""Print a link to the emails site if we're building text messages site and vice versa."""
|
|
252
|
-
site_type: SiteType = EMAIL if args.all_emails else TEXT_MESSAGE
|
|
253
|
-
link_style = OTHER_SITE_LINK_STYLE if is_header else 'light_slate_grey bold'
|
|
254
|
-
|
|
255
|
-
if is_header:
|
|
256
|
-
print_starred_header(f"This is the Epstein {site_type.title()}s site", num_spaces=4, num_stars=14)
|
|
257
|
-
|
|
258
|
-
other_site_type: SiteType = TEXT_MESSAGE if site_type == EMAIL else EMAIL
|
|
259
|
-
other_site_msg = "another site with" + (' all of' if other_site_type == EMAIL else '')
|
|
260
|
-
other_site_msg += f" Epstein's {other_site_type}s also generated by this code"
|
|
261
|
-
markup_msg = link_markup(SITE_URLS[other_site_type], other_site_msg, link_style)
|
|
262
|
-
print_centered(parenthesize(Text.from_markup(markup_msg)), style='bold')
|
|
263
|
-
|
|
264
|
-
if not is_header:
|
|
265
|
-
return
|
|
266
|
-
|
|
267
|
-
word_count_link = link_text_obj(WORD_COUNT_URL, 'most frequently used words in the emails and texts', AUX_SITE_LINK_STYLE)
|
|
268
|
-
print_centered(parenthesize(word_count_link))
|
|
269
|
-
metadata_link = link_text_obj(JSON_METADATA_URL, 'author attribution explanations', AUX_SITE_LINK_STYLE)
|
|
270
|
-
print_centered(parenthesize(metadata_link))
|
|
271
|
-
json_link = link_text_obj(WORD_COUNT_URL, "epstein's json files", AUX_SITE_LINK_STYLE)
|
|
272
|
-
print_centered(parenthesize(json_link))
|
|
273
|
-
|
|
274
|
-
|
|
275
275
|
def print_page_title(expand: bool = True, width: int | None = None) -> None:
|
|
276
276
|
title_panel = Panel(Text(PAGE_TITLE, justify='center'), expand=expand, style=TITLE_STYLE, width=width)
|
|
277
277
|
console.print(Align.center(vertically_pad(title_panel)))
|
|
@@ -294,7 +294,7 @@ def print_panel(msg: str, style: str = 'black on white', padding: tuple | None =
|
|
|
294
294
|
def print_section_header(msg: str, style: str = SECTION_HEADER_STYLE, is_centered: bool = False) -> None:
|
|
295
295
|
panel = Panel(Text(msg, justify='center'), expand=True, padding=(1, 1), style=style)
|
|
296
296
|
panel = Align.center(panel) if is_centered else panel
|
|
297
|
-
console.print(Padding(panel, (3,
|
|
297
|
+
console.print(Padding(panel, (3, 2, 1, 2)))
|
|
298
298
|
|
|
299
299
|
|
|
300
300
|
def print_starred_header(msg: str, num_stars: int = 7, num_spaces: int = 2, style: str = TITLE_STYLE) -> None:
|
epstein_files/util/word_count.py
CHANGED
|
@@ -198,7 +198,7 @@ def write_word_counts_html() -> None:
|
|
|
198
198
|
word_count = WordCount()
|
|
199
199
|
|
|
200
200
|
# Remove dupes, junk mail, and fwded articles from emails
|
|
201
|
-
emails = [e for e in epstein_files.
|
|
201
|
+
emails = [e for e in epstein_files.non_duplicate_emails() if not (e.is_junk_mail() or e.is_fwded_article())]
|
|
202
202
|
|
|
203
203
|
for email in emails:
|
|
204
204
|
if specified_names and email.author not in specified_names:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: epstein-files
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.14
|
|
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
|
|
@@ -43,11 +43,12 @@ Description-Content-Type: text/markdown
|
|
|
43
43
|
|
|
44
44
|
|
|
45
45
|
## Usage
|
|
46
|
-
|
|
47
46
|
#### Installation
|
|
48
47
|
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
48
|
1. Use `poetry install` for easiest time installing. `pip install epstein-files` should also work, though `pipx install epstein-files` is usually better.
|
|
50
49
|
|
|
50
|
+
|
|
51
|
+
#### Command Line Tools
|
|
51
52
|
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:
|
|
52
53
|
|
|
53
54
|
```bash
|
|
@@ -63,7 +64,7 @@ epstein_generate
|
|
|
63
64
|
# Search for a string:
|
|
64
65
|
epstein_search Bannon
|
|
65
66
|
# Or a regex:
|
|
66
|
-
epstein_search '\bSteve\s*Bannon\b'
|
|
67
|
+
epstein_search '\bSteve\s*Bannon|Jeffrey\s*Epstein\b'
|
|
67
68
|
|
|
68
69
|
# Show a file with color highlighting of keywords:
|
|
69
70
|
epstein_show 030999
|
|
@@ -82,6 +83,12 @@ epstein_diff 030999 020442
|
|
|
82
83
|
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.
|
|
83
84
|
Run `epstein_generate --help` for command line option assistance.
|
|
84
85
|
|
|
86
|
+
**Optional:** There are a handful of emails that I extracted from the legal filings they were contained in. If you want to include these files in your local analysis you'll need to copy those files from the repo into your local document directory. Something like:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
cp ./emails_extracted_from_legal_filings/*.txt "$EPSTEIN_DOCS_DIR"
|
|
90
|
+
```
|
|
91
|
+
|
|
85
92
|
|
|
86
93
|
#### As A Library
|
|
87
94
|
```python
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
epstein_files/__init__.py,sha256=9mClHe3YkTWHulLOZIO2uaxYcff-krpEsc0vphYlwps,4975
|
|
2
|
+
epstein_files/documents/communication.py,sha256=oqNsSDWe-N0jSmchIHxpihihzIWha-foFqMwKZlxyng,2057
|
|
3
|
+
epstein_files/documents/document.py,sha256=1qL1V5VrrtI7uuuLvOw-JU83khRzzEURduuoh_pfghI,17114
|
|
4
|
+
epstein_files/documents/email.py,sha256=eKfDGwbP1nYVfhozM0bSVf-5T-_l_k-0D_HVrQldm38,40904
|
|
5
|
+
epstein_files/documents/emails/email_header.py,sha256=wkPfSLbmzkAeQwvhf0bAeFDLPbQT-EeG0v8vNNLYktM,7502
|
|
6
|
+
epstein_files/documents/imessage/text_message.py,sha256=JPHlO-5Xgt5V5E9fDsgCEr3XOp7FyzlhIHmZhFNZcmg,2806
|
|
7
|
+
epstein_files/documents/json_file.py,sha256=WcZW5NNqA67rHTdopbOGtup00muNaLlvrNgKb-K4zO8,1504
|
|
8
|
+
epstein_files/documents/messenger_log.py,sha256=le-cj_ZBDUb_jnxP_F05KlnPjh0nDbgpPSWl4-HL-J4,6502
|
|
9
|
+
epstein_files/documents/other_file.py,sha256=tJmEH3cGeEcRIZW5F-RuSJprYM_2r1jEbsF_kjSsA3E,9788
|
|
10
|
+
epstein_files/epstein_files.py,sha256=aO2vntbA7DonSk96xB5us5VaDSpp79Mpu8eYJ_g_8Qo,20025
|
|
11
|
+
epstein_files/util/constant/common_words.py,sha256=aR0UjoWmxyR49XS-DtHECQ1CiA_bK8hNP6CQ1TS9yZA,3696
|
|
12
|
+
epstein_files/util/constant/html.py,sha256=9U098TGzlghGg4WfxLYHyub5JGR17Dv7VP5i2MSu8Kk,1415
|
|
13
|
+
epstein_files/util/constant/names.py,sha256=smC9xsR9E9WECXi_ygK_6lrcEPZWZINLZrp_-BthUtA,10377
|
|
14
|
+
epstein_files/util/constant/output_files.py,sha256=BkV4_gmdj46RfGy5SFYp6dgTty3FtlBth5YGmaGutls,1700
|
|
15
|
+
epstein_files/util/constant/strings.py,sha256=etCmLZPuriVYDap4iG_0Nfd92P1cvRpK2R7ZpVAGDrw,1942
|
|
16
|
+
epstein_files/util/constant/urls.py,sha256=EKzpL1np3cdyYvUlgv1zl9IJU8Vrg8jXpAu6YpM0_Bk,5283
|
|
17
|
+
epstein_files/util/constants.py,sha256=W-4ibPdv8I62uNyoBUR7sWWiqUWWr2n414WnZNA_Who,112605
|
|
18
|
+
epstein_files/util/data.py,sha256=JccGFZGiCGm7XtwpQTocIjGYOr6hTUpEPwHhjyW9Xnc,3164
|
|
19
|
+
epstein_files/util/doc_cfg.py,sha256=uVUgZF7p5QMhbPEVauQWlRWQRhP0Imr5XaNQtMk0E7c,9053
|
|
20
|
+
epstein_files/util/env.py,sha256=zg-TJ8ea6nTa0PyYgY97Zksre8au1ELv2i8vOizZt7Y,5645
|
|
21
|
+
epstein_files/util/file_helper.py,sha256=tacTe1GcAnckPFvjMgxRRSLnFgr2aVIYsgfDR_C9uXk,2780
|
|
22
|
+
epstein_files/util/highlighted_group.py,sha256=mNcdML0h88e2voEiUJxpgAVXHh3jQ8f0XV8qVdZMkBM,36550
|
|
23
|
+
epstein_files/util/logging.py,sha256=fuREq06xUUI3DfCV2JE-8QM-sQKxpLDj0_AYFO6qR1M,1983
|
|
24
|
+
epstein_files/util/output.py,sha256=bb_-jRoFNNMHXPSaptEXdkbqNDJYOpNSs6dkJKvi_HQ,7581
|
|
25
|
+
epstein_files/util/rich.py,sha256=bQPlOEZ6qTpVF4yPnwmlBk4K11zH5RJjwbWeBIOUUGE,15191
|
|
26
|
+
epstein_files/util/search_result.py,sha256=1fxe0KPBQXBk4dLfu6m0QXIzYfZCzvaSkWqvghJGzxY,567
|
|
27
|
+
epstein_files/util/timer.py,sha256=8hxW4Y1JcTUfnBrHh7sL2pM9xu1sL4HFQM4CmmzTarU,837
|
|
28
|
+
epstein_files/util/word_count.py,sha256=dTBNqX98sj7W46O0uit76I4hYBhm0bsY1Q7RHwWehiU,9349
|
|
29
|
+
epstein_files-1.0.14.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
30
|
+
epstein_files-1.0.14.dist-info/METADATA,sha256=AUw8p6SQuvkJONsHErig0L--FyAU2y892DYpdpimqtg,5867
|
|
31
|
+
epstein_files-1.0.14.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
|
|
32
|
+
epstein_files-1.0.14.dist-info/entry_points.txt,sha256=5qYgwAXpxegeAicD_rzda_trDRnUC51F5UVDpcZ7j6Q,240
|
|
33
|
+
epstein_files-1.0.14.dist-info/RECORD,,
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
epstein_files/__init__.py,sha256=qVFB7sS6XSlZX-ByyDwdbGSn2h06aoX2Mx8WcgRb-To,4710
|
|
2
|
-
epstein_files/documents/communication.py,sha256=i6eob0ucnI7AY1sGuJlzrtU_C0mxEtrPEQZE4yNeM9w,2049
|
|
3
|
-
epstein_files/documents/document.py,sha256=VsXIJhY7HTUlQrnTzYv5VLtYugdb-c2ClrfInPb5l2M,17095
|
|
4
|
-
epstein_files/documents/email.py,sha256=P2c8Z23qaiWj6qWf4QKTuLvqKDoUJmu7SyzJ6FQCmPA,40727
|
|
5
|
-
epstein_files/documents/emails/email_header.py,sha256=wkPfSLbmzkAeQwvhf0bAeFDLPbQT-EeG0v8vNNLYktM,7502
|
|
6
|
-
epstein_files/documents/imessage/text_message.py,sha256=4gFvTfulj_Su10lNQl6Hq_p9ArTrSmn5pfC22YRJXjI,2794
|
|
7
|
-
epstein_files/documents/json_file.py,sha256=tIYTwA3FYkwVZSpXvFYyUoH9m2sGYCD1U0ttamH6r1o,1306
|
|
8
|
-
epstein_files/documents/messenger_log.py,sha256=BW3J52a9XxNVoK7SxtfJGydSNPoeKGE0PkdkMpf9sJ0,6294
|
|
9
|
-
epstein_files/documents/other_file.py,sha256=pnl_q1o7ur3eeqGPwsYL2qbM3Y8O9LX6j6LbWnoxAiE,9939
|
|
10
|
-
epstein_files/epstein_files.py,sha256=sbgS7GlrlWo1kuH4YXUSvbYX_SApgrwhpx6_qdHmrBM,19119
|
|
11
|
-
epstein_files/util/constant/common_words.py,sha256=aR0UjoWmxyR49XS-DtHECQ1CiA_bK8hNP6CQ1TS9yZA,3696
|
|
12
|
-
epstein_files/util/constant/html.py,sha256=9U098TGzlghGg4WfxLYHyub5JGR17Dv7VP5i2MSu8Kk,1415
|
|
13
|
-
epstein_files/util/constant/names.py,sha256=ObLJCvit_C1cwLc-7Wcjh-C5oQrpww1HLk6DrEvnu8E,10368
|
|
14
|
-
epstein_files/util/constant/output_files.py,sha256=BkV4_gmdj46RfGy5SFYp6dgTty3FtlBth5YGmaGutls,1700
|
|
15
|
-
epstein_files/util/constant/strings.py,sha256=02DwbhAe8qBRq5HOUFx5FafXJ1P2-RJf9TCVu2b7UDQ,1932
|
|
16
|
-
epstein_files/util/constant/urls.py,sha256=EKzpL1np3cdyYvUlgv1zl9IJU8Vrg8jXpAu6YpM0_Bk,5283
|
|
17
|
-
epstein_files/util/constants.py,sha256=tSHrgzDOTx0KwGy4HI7ShIwaRMX1o7otW3CkKvRplZs,112121
|
|
18
|
-
epstein_files/util/data.py,sha256=gOaETo4LvN3VgRvA1dB2_NRDL3wiL-xBICZ2jfD-knk,2997
|
|
19
|
-
epstein_files/util/doc_cfg.py,sha256=irQljeGXlB9wbRbP05pWQZMS2-DbhdugfVGD8Q2UhSg,9006
|
|
20
|
-
epstein_files/util/env.py,sha256=HnYcfHSNkwVJ_T75Woy43_OpDyxD0KHPj3GxcVx86N4,5751
|
|
21
|
-
epstein_files/util/file_helper.py,sha256=tacTe1GcAnckPFvjMgxRRSLnFgr2aVIYsgfDR_C9uXk,2780
|
|
22
|
-
epstein_files/util/highlighted_group.py,sha256=rKJsUQfPzQwMMu5--QWsxNFxW303RI8yq69sw4vi2RA,36720
|
|
23
|
-
epstein_files/util/logging.py,sha256=fuREq06xUUI3DfCV2JE-8QM-sQKxpLDj0_AYFO6qR1M,1983
|
|
24
|
-
epstein_files/util/output.py,sha256=XcflgSOlzUGj6FsFaK6j4Dljld8A0h_uVV7ERcI_EYw,8120
|
|
25
|
-
epstein_files/util/rich.py,sha256=V8WDQPuCcubn46HW1cLZ6uT-CBAnBB17Hozsvv7Pd4g,14987
|
|
26
|
-
epstein_files/util/search_result.py,sha256=1fxe0KPBQXBk4dLfu6m0QXIzYfZCzvaSkWqvghJGzxY,567
|
|
27
|
-
epstein_files/util/timer.py,sha256=8hxW4Y1JcTUfnBrHh7sL2pM9xu1sL4HFQM4CmmzTarU,837
|
|
28
|
-
epstein_files/util/word_count.py,sha256=8qBTuq3d0Q-3fwiuECKWi2RfL-KUiZD8TciwvfL0D_o,9353
|
|
29
|
-
epstein_files-1.0.13.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
30
|
-
epstein_files-1.0.13.dist-info/METADATA,sha256=ZfGSbuEOmAhzDs_a6KiKjXfhLNRwcZoXklAK1KphX7I,5480
|
|
31
|
-
epstein_files-1.0.13.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
|
|
32
|
-
epstein_files-1.0.13.dist-info/entry_points.txt,sha256=5qYgwAXpxegeAicD_rzda_trDRnUC51F5UVDpcZ7j6Q,240
|
|
33
|
-
epstein_files-1.0.13.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|