epstein-files 1.0.1__py3-none-any.whl → 1.0.3__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.
@@ -2,7 +2,6 @@
2
2
  import json
3
3
  from os import devnull
4
4
  from pathlib import Path
5
- from typing import Literal
6
5
 
7
6
  from rich.align import Align
8
7
  from rich.console import Console, RenderableType
@@ -20,9 +19,8 @@ from epstein_files.util.constant.urls import *
20
19
  from epstein_files.util.constants import FALLBACK_TIMESTAMP, HEADER_ABBREVIATIONS
21
20
  from epstein_files.util.data import json_safe
22
21
  from epstein_files.util.env import args
23
- from epstein_files.util.file_helper import file_size_str
24
22
  from epstein_files.util.highlighted_group import ALL_HIGHLIGHTS, HIGHLIGHTED_NAMES, EpsteinHighlighter
25
- from epstein_files.util.logging import logger
23
+ from epstein_files.util.logging import log_file_write, logger
26
24
 
27
25
  TITLE_WIDTH = 50
28
26
  NUM_COLOR_KEY_COLS = 4
@@ -73,6 +71,14 @@ def add_cols_to_table(table: Table, col_names: list[str]) -> None:
73
71
  table.add_column(col, justify='left' if i == 0 else 'center')
74
72
 
75
73
 
74
+ def build_highlighter(pattern: str) -> EpsteinHighlighter:
75
+ class TempHighlighter(EpsteinHighlighter):
76
+ """rich.highlighter that finds and colors interesting keywords based on the above config."""
77
+ highlights = EpsteinHighlighter.highlights + [re.compile(fr"(?P<trump>{pattern})", re.IGNORECASE)]
78
+
79
+ return TempHighlighter()
80
+
81
+
76
82
  def join_texts(txts: list[Text], join: str = ' ', encloser: str = '') -> Text:
77
83
  """Join rich.Text objs into one."""
78
84
  if encloser:
@@ -91,8 +97,11 @@ def join_texts(txts: list[Text], join: str = ' ', encloser: str = '') -> Text:
91
97
  return txt
92
98
 
93
99
 
94
- def key_value_txt(key: str, value: Text | str) -> Text:
100
+ def key_value_txt(key: str, value: Text | int | str) -> Text:
95
101
  """Generate a Text obj for 'key=value'."""
102
+ if isinstance(value, int):
103
+ value = Text(f"{value}", style='cyan')
104
+
96
105
  return Text('').append(key, style=KEY_STYLE).append('=', style=SYMBOL_STYLE).append(value)
97
106
 
98
107
 
@@ -139,7 +148,12 @@ def print_color_key() -> None:
139
148
 
140
149
 
141
150
  def print_header(epstein_files: 'EpsteinFiles') -> None:
142
- console.print(f"This site isn't optimized for mobile but if you get past the header it should be readable.", style='dim')
151
+ not_optimized_msg = f"This site isn't optimized for mobile"
152
+
153
+ if not args.all_emails:
154
+ not_optimized_msg += f" but if you get past the header it should be readable"
155
+
156
+ console.print(f"{not_optimized_msg}.\n", style='dim')
143
157
  print_page_title(width=TITLE_WIDTH)
144
158
  print_other_site_link()
145
159
  _print_external_links()
@@ -219,10 +233,8 @@ def print_other_site_link(is_header: bool = True) -> None:
219
233
  print_centered(parenthesize(Text.from_markup(markup_msg)), style='bold')
220
234
  word_count_link = link_text_obj(WORD_COUNT_URL, 'site showing the most frequently used words in these communiques', OTHER_SITE_LINK_STYLE)
221
235
  print_centered(parenthesize(word_count_link))
222
-
223
- if is_header:
224
- metadata_link = link_text_obj(JSON_METADATA_URL, 'file metadata containing author attribution explanations', OTHER_SITE_LINK_STYLE)
225
- print_centered(parenthesize(metadata_link))
236
+ metadata_link = link_text_obj(JSON_METADATA_URL, 'metadata with author attribution explanations', OTHER_SITE_LINK_STYLE)
237
+ print_centered(parenthesize(metadata_link))
226
238
 
227
239
 
228
240
  def print_page_title(expand: bool = True, width: int | None = None) -> None:
@@ -298,7 +310,7 @@ def write_html(output_path: Path) -> None:
298
310
  return
299
311
 
300
312
  console.save_html(str(output_path), code_format=CONSOLE_HTML_FORMAT, theme=HTML_TERMINAL_THEME)
301
- logger.warning(f"Wrote {file_size_str(output_path)} to '{output_path}'")
313
+ log_file_write(output_path)
302
314
 
303
315
 
304
316
  def _print_abbreviations_table() -> None:
@@ -1,26 +1,42 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: epstein-files
3
- Version: 1.0.1
3
+ Version: 1.0.3
4
4
  Summary: Tools for working with the Jeffrey Epstein documents released in November 2025.
5
+ Home-page: https://michelcrypt4d4mus.github.io/epstein_text_messages/
6
+ License: GPL-3.0-or-later
7
+ Keywords: Epstein,Jeffrey Epstein
5
8
  Author: Michel de Cryptadamus
6
9
  Requires-Python: >=3.11,<4.0
10
+ Classifier: Development Status :: 5 - Production/Stable
11
+ Classifier: Environment :: Console
12
+ Classifier: Intended Audience :: Information Technology
13
+ Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
14
+ Classifier: Programming Language :: Python
7
15
  Classifier: Programming Language :: Python :: 3
8
16
  Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
9
20
  Requires-Dist: datefinder (>=0.7.3,<0.8.0)
10
21
  Requires-Dist: inflection (>=0.5.1,<0.6.0)
11
22
  Requires-Dist: python-dateutil (>=2.9.0.post0,<3.0.0)
12
23
  Requires-Dist: python-dotenv (>=1.2.1,<2.0.0)
13
24
  Requires-Dist: requests (>=2.32.5,<3.0.0)
14
25
  Requires-Dist: rich (>=14.2.0,<15.0.0)
26
+ Project-URL: Emails, https://michelcrypt4d4mus.github.io/epstein_text_messages/all_emails_epstein_files_nov_2025.html
27
+ Project-URL: Metadata, https://michelcrypt4d4mus.github.io/epstein_text_messages/file_metadata_epstein_files_nov_2025.json
28
+ Project-URL: Repository, https://github.com/michelcrypt4d4mus/epstein_text_messages
29
+ Project-URL: TextMessages, https://michelcrypt4d4mus.github.io/epstein_text_messages
30
+ Project-URL: WordCounts, https://michelcrypt4d4mus.github.io/epstein_text_messages/communication_word_count_epstein_files_nov_2025.html
15
31
  Description-Content-Type: text/markdown
16
32
 
17
33
  # I Made Epstein's Text Messages Great Again
18
34
 
19
35
  * [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)
20
36
  * The Epstein text messages (and some of the emails along with summary counts of sent emails to/from Epstein) generated by this code can be viewed [here](https://michelcrypt4d4mus.github.io/epstein_text_messages/).
21
- * All of His Emails can be read at another page also generated by this code [here](https://michelcrypt4d4mus.github.io/epstein_emails_house_oversight/).
22
- * Word counts for the emails and text messages are [here](https://michelcrypt4d4mus.github.io/epstein_text_messages/epstein_emails_word_count.html).
23
- * 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/epstein_files_nov_2025_cryptadamus_metadata.json)
37
+ * All of His Emails can be read at another page also generated by this code [here](https://michelcrypt4d4mus.github.io/epstein_text_messages/all_emails_epstein_files_nov_2025.html).
38
+ * Word counts for the emails and text messages are [here](https://michelcrypt4d4mus.github.io/epstein_text_messages/communication_word_count_epstein_files_nov_2025.html).
39
+ * 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)
24
40
  * Configuration variables assigning specific `HOUSE_OVERSIGHT_XXXXXX.txt` file IDs (the `111111` part) as being emails to or from particular people based on various research and contributions can be found in [constants.py](./epstein_files/util/constants.py). Everything in `constants.py` should also appear in the JSON metadata.
25
41
 
26
42
 
@@ -31,11 +47,20 @@ Description-Content-Type: text/markdown
31
47
  You need to set the `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:
32
48
 
33
49
  ```bash
34
- DOCS_DIR=/path/to/epstein/ocr_txt_files ./generate.py
50
+ # Generate color highlighted texts/emails/other files
51
+ DOCS_DIR=/path/to/epstein/ocr_txt_files epstein_generate
52
+
53
+ # Search
54
+ DOCS_DIR=/path/to/epstein/ocr_txt_files epstein_search Bannon
55
+
56
+ # Show a color highlighted file
57
+ DOCS_DIR=/path/to/epstein/ocr_txt_files epstein_show 030999
58
+ # This also works
59
+ DOCS_DIR=/path/to/epstein/ocr_txt_files epstein_show HOUSE_OVERSIGHT_030999
35
60
  ```
36
61
 
37
- Run `./generate.py --help` for command line option assistance. Look in the [scripts](./scripts/) folder for various scripts.
38
- The first time you run anything it will take a few minutes to fix all the data, attribute the redacted emails, etc. Once you've run things once you can run the `./generate.py --pickled` to load the cached fixed up data and things will be quick.
62
+ Run `epstein_generate --help` for command line option assistance.
63
+ The first time you run anything it will take a few minutes to fix all the data, attribute the redacted emails, etc. Once you've run things once you can run the `epstein_generate --pickled` to load the cached fixed up data and things will be quick.
39
64
 
40
65
  #### As A Library
41
66
  ```python
@@ -0,0 +1,33 @@
1
+ epstein_files/__init__.py,sha256=ovNZSEnsLnGahLlDZIai9jC6ZWo7RFd79KstrOGwJak,4861
2
+ epstein_files/documents/communication.py,sha256=SunZdjMhR9v6y8LlQ6jhIu8vYjSndaBK0Su1mKnhfj0,2060
3
+ epstein_files/documents/document.py,sha256=s6k3qqZ9pnAWBqkm45o1T4nTIUth1No2jxhiYTF3jpI,16732
4
+ epstein_files/documents/email.py,sha256=QRlOE3OIu_o4AU7o3XuBMzVTTV3OZCajEXpbIZUdsck,38211
5
+ epstein_files/documents/emails/email_header.py,sha256=wkPfSLbmzkAeQwvhf0bAeFDLPbQT-EeG0v8vNNLYktM,7502
6
+ epstein_files/documents/imessage/text_message.py,sha256=wfWPQhwGG5Yzyhbr1NAQAY0bzRjjqVZmh8SPl48XmAM,3025
7
+ epstein_files/documents/json_file.py,sha256=Vf9iHiEhUqk-hEh6lGZX_mJNWZUUQWeT-UI3FhKW0hw,1101
8
+ epstein_files/documents/messenger_log.py,sha256=rOSy5yMerYBQ2r_o4SvuJ7Oeu-KhZVIIlh_Csb6uar0,5860
9
+ epstein_files/documents/other_file.py,sha256=aD1nFkwsQ1eKb9Li1xfqEGGbqhkQlpR-6vIt5GHMyk8,9087
10
+ epstein_files/epstein_files.py,sha256=XLyit5LmICnP44XoQWHUgMpRLS1-QgJZDaxO15qUnsI,18349
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=iwnFqIceffYyLj7AaCsh3uve4Y0WbsZvHukjA1aFJWY,10104
14
+ epstein_files/util/constant/output_files.py,sha256=B2qEXfNI_gT2Vp5HGSld2xM0PfeZ27j65HNymSmyzX4,974
15
+ epstein_files/util/constant/strings.py,sha256=RBWJQnOXqBba8TwmjpvtkY8Jt54aFt4LYajoR8RanDk,1917
16
+ epstein_files/util/constant/urls.py,sha256=2AM7AUqJQcNjCLrB6bKdh2sMtBOn7u8a8mwNq6HC0Zk,5621
17
+ epstein_files/util/constants.py,sha256=GxI7RcnRgR8rDH4-dPrLlUH7q6mnhg5oK7ks56ZmpkA,110796
18
+ epstein_files/util/data.py,sha256=xwTqrbAi7ZDJM0iyFVOevnokP_oIQ2npkRjHzF1KGGY,2908
19
+ epstein_files/util/doc_cfg.py,sha256=I-n7_77hcA5DHGcqXISEjXOiTjYnTCLS7E16PUYw2kw,9736
20
+ epstein_files/util/env.py,sha256=mvYy3Kj576aULU6E7NPuN-5ZEVOn0Zb4HAwR8VOmUMo,4839
21
+ epstein_files/util/file_helper.py,sha256=v_bE10MHEcXti9DVJo4WqyOsG83Xrv05S3Vc70cYJkk,3082
22
+ epstein_files/util/highlighted_group.py,sha256=He6LDIhcT_YZyAkGHcOR-T_znACoEyNznKWOKH4lA40,35564
23
+ epstein_files/util/logging.py,sha256=b9iCTQkpAxu_3HphM5wm7VuPbWj9tocTuyUvMUTaI5A,2137
24
+ epstein_files/util/output.py,sha256=k4HrOKvP6Os0-LrxVRiNKk7Pw9M3RxrlYP2Eql7TFIA,7366
25
+ epstein_files/util/rich.py,sha256=x81QievKngC0oxsCpHRxKhjFstZ5hBVx91nFy63g_RQ,13709
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=XTINgLm01jFQlNgdiLCcVFCodXAIb1dNbaAvznoRb1o,6757
29
+ epstein_files-1.0.3.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
30
+ epstein_files-1.0.3.dist-info/METADATA,sha256=ZMzrOatPsGFecuYFiEGpvEHXBp9dh5GNzLO1NOuY_RM,4997
31
+ epstein_files-1.0.3.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
32
+ epstein_files-1.0.3.dist-info/entry_points.txt,sha256=EV9qTh_n9X_1MOiQnxG5hM6R5v0rfi8W4QE-bsZkw3o,238
33
+ epstein_files-1.0.3.dist-info/RECORD,,
@@ -0,0 +1,7 @@
1
+ [console_scripts]
2
+ epstein_diff=epstein_files:epstein_diff
3
+ epstein_dump_urls=epstein_files:epstein_dump_urls
4
+ epstein_generate=epstein_files:generate_html
5
+ epstein_search=epstein_files:epstein_search
6
+ epstein_show=epstein_files:epstein_show
7
+
@@ -1,30 +0,0 @@
1
- epstein_files/__init__.py,sha256=HKOGWVzyiEl0II8s7qnO33wcTZPw8dr3HDfT7_VnY2U,7831
2
- epstein_files/documents/communication.py,sha256=SunZdjMhR9v6y8LlQ6jhIu8vYjSndaBK0Su1mKnhfj0,2060
3
- epstein_files/documents/document.py,sha256=E2VUuHSoam8r8pyRbWy68_cVFU9DJ0irbtYULaDBYzE,16378
4
- epstein_files/documents/email.py,sha256=IpKeOuLTmHWowBvUUEp-tyTC8pwEmXg3XgLJkplQZWg,37717
5
- epstein_files/documents/emails/email_header.py,sha256=wkPfSLbmzkAeQwvhf0bAeFDLPbQT-EeG0v8vNNLYktM,7502
6
- epstein_files/documents/imessage/text_message.py,sha256=DMdd__L7UPad0YS49MJf_3bTVyE1BLfWafQbDQierC8,3272
7
- epstein_files/documents/json_file.py,sha256=Vf9iHiEhUqk-hEh6lGZX_mJNWZUUQWeT-UI3FhKW0hw,1101
8
- epstein_files/documents/messenger_log.py,sha256=-hSMFH_dyrjGLdph4SU2xQK4RpXOhkR3R_nqRrz3e1w,5620
9
- epstein_files/documents/other_file.py,sha256=JbKDtNrQ1Ua5vGPlZayON5Kgy0oJ-gHcdO9l9Iv9wRo,8930
10
- epstein_files/epstein_files.py,sha256=ruhl24FgOpEdcqbMcIpgyYlqEBi1ZeztQ7QmZMYANp0,17856
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=eSgHnOqMAy7Czfw1vJ3lvniDST7QpfuQ8XgzttXpAi8,10191
14
- epstein_files/util/constant/strings.py,sha256=3JTqD0luJrC3NbGXn4q6P-gIaaNVx36P1oCmp92gAoM,1750
15
- epstein_files/util/constant/urls.py,sha256=P_nnb5cIrJ2NCbd4CoRfilZ5jrOzFs30jNK50F7IjZw,5483
16
- epstein_files/util/constants.py,sha256=l0TrpncCJcecar5geggLVfOJVhicWcu3zws-62Cslzg,102472
17
- epstein_files/util/data.py,sha256=s7EgmQ6SC6MoUMhP8GaxglJOJpU_nRmwI-T2inLl8hs,3329
18
- epstein_files/util/doc_cfg.py,sha256=AFLBp9PO2tBUYhTeNztpkWs69VPr41fCuA22IesM59g,9914
19
- epstein_files/util/env.py,sha256=9wM4mKPZoJO9J5VKLP67ZR1IEMkH2UaGdIaYm2tptMQ,4581
20
- epstein_files/util/file_helper.py,sha256=ea428og2gyUsMWd2GFldmAGvuqGNNHaTc7gGGSM_0aI,3827
21
- epstein_files/util/highlighted_group.py,sha256=UO0pqQH29JHiOMK2psIozIeA0zinDkql-NYDGRmFUzA,35173
22
- epstein_files/util/logging.py,sha256=0mABrI5TvodLDe-9svHv3YaIdSyr8PXFcu4nntW1WsI,1858
23
- epstein_files/util/rich.py,sha256=cLkiSg3f68bUxobzRiBRfrgS7Ya-FK7ltpQcZXNHMX4,13317
24
- epstein_files/util/search_result.py,sha256=1fxe0KPBQXBk4dLfu6m0QXIzYfZCzvaSkWqvghJGzxY,567
25
- epstein_files/util/timer.py,sha256=8hxW4Y1JcTUfnBrHh7sL2pM9xu1sL4HFQM4CmmzTarU,837
26
- epstein_files/util/word_count.py,sha256=XTINgLm01jFQlNgdiLCcVFCodXAIb1dNbaAvznoRb1o,6757
27
- epstein_files-1.0.1.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
28
- epstein_files-1.0.1.dist-info/METADATA,sha256=IK5B-ltx_L0-EK2Oq2Q2gVXWlhYqKoYw6HCFisqitvQ,3587
29
- epstein_files-1.0.1.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
30
- epstein_files-1.0.1.dist-info/RECORD,,