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.
@@ -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
- return Table(title=title, **{**DEFAULT_TABLE_KWARGS, **kwargs})
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
- print_other_site_link()
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, 0, 1, 0)))
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:
@@ -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.emails if not (e.is_duplicate() or e.is_junk_mail() or e.is_fwded_article())]
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.13
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,,