epstein-files 1.2.1__py3-none-any.whl → 1.4.1__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.
@@ -1,5 +1,6 @@
1
1
  import json
2
2
  from os import unlink
3
+ from subprocess import CalledProcessError, check_output
3
4
  from typing import cast
4
5
 
5
6
  from rich.padding import Padding
@@ -40,35 +41,18 @@ DEFAULT_EMAILERS = [
40
41
  STEVEN_HOFFENBERG,
41
42
  MASHA_DROKOVA,
42
43
  EHUD_BARAK,
43
- MARTIN_NOWAK,
44
44
  STEVE_BANNON,
45
45
  TYLER_SHEARS,
46
- JIDE_ZEITLIN,
47
46
  CHRISTINA_GALBRAITH,
48
- DAVID_STERN,
49
47
  MOHAMED_WAHEED_HASSAN,
50
48
  JENNIFER_JACQUET,
51
49
  ZUBAIR_KHAN,
50
+ ROSS_GOW,
51
+ DAVID_BLAINE,
52
52
  None,
53
53
  JEFFREY_EPSTEIN,
54
54
  ]
55
55
 
56
- INTERESTING_EMAIL_IDS = [
57
- '032229', # Michael Wolff on strategy
58
- '028784', # seminars: Money / Power
59
- '029342', # Hakeem Jeffries
60
- '023454', # Email invitation sent to tech CEOs + Epstein
61
- '030630', # 'What happens with zubair's project?'
62
- '033178', # 'How is it going with Zubair?'
63
- '022396', # Ukraine friend
64
- '026505', # I know how dirty trump is
65
- '029679', # Trump's driver was the bag man
66
- '030781', '026258', '026260', # Bannon cripto coin issues
67
- '023627', # Michael Wolff article w/Brock
68
- '032359', # Jabor e-currency
69
- #'023208', # Extremely long Leon Black email chain
70
- ]
71
-
72
56
  INTERESTING_TEXT_IDS = [
73
57
  '027275', # "Crypto- Kerry- Qatar -sessions"
74
58
  '027165', # melaniee walker crypto health
@@ -102,8 +86,17 @@ def print_emailers_info(epstein_files: EpsteinFiles) -> None:
102
86
  svg_path = f"{EMAILERS_TABLE_PNG_PATH}.svg"
103
87
  console.save_svg(svg_path, theme=HTML_TERMINAL_THEME, title="Epstein Emailers")
104
88
  log_file_write(svg_path)
105
- import cairosvg
106
- cairosvg.svg2png(url=svg_path, write_to=str(EMAILERS_TABLE_PNG_PATH))
89
+
90
+ try:
91
+ # Inkscape is better at converting svg to png
92
+ inkscape_cmd_args = ['inkscape', f'--export-filename={EMAILERS_TABLE_PNG_PATH}', svg_path]
93
+ logger.warning(f"Running inkscape cmd: {' '.join(inkscape_cmd_args)}")
94
+ check_output(inkscape_cmd_args)
95
+ except (CalledProcessError, FileNotFoundError) as e:
96
+ logger.error(f"Failed to convert svg to png with inkscape, falling back to cairosvg: {e}")
97
+ import cairosvg
98
+ cairosvg.svg2png(url=svg_path, write_to=str(EMAILERS_TABLE_PNG_PATH))
99
+
107
100
  log_file_write(EMAILERS_TABLE_PNG_PATH)
108
101
  unlink(svg_path)
109
102
 
@@ -112,6 +105,7 @@ def print_emails_section(epstein_files: EpsteinFiles) -> list[Email]:
112
105
  """Returns emails that were printed (may contain dupes if printed for both author and recipient)."""
113
106
  print_section_header(('Selections from ' if not args.all_emails else '') + 'His Emails')
114
107
  all_emailers = sorted(epstein_files.emailers(), key=lambda person: person.earliest_email_at())
108
+ all_emails = Person.emails_from_people(all_emailers)
115
109
  num_emails_printed_since_last_color_key = 0
116
110
  printed_emails: list[Email] = []
117
111
  people_to_print: list[Person]
@@ -148,13 +142,14 @@ def print_emails_section(epstein_files: EpsteinFiles) -> list[Email]:
148
142
 
149
143
  # Print other interesting emails
150
144
  printed_email_ids = [email.file_id for email in printed_emails]
151
- extra_emails = [e for e in epstein_files.for_ids(INTERESTING_EMAIL_IDS) if e.file_id not in printed_email_ids]
145
+ extra_emails = [e for e in all_emails if e.is_interesting() and e.file_id not in printed_email_ids]
146
+ logger.warning(f"Found {len(extra_emails)} extra_emails...")
152
147
 
153
148
  if len(extra_emails) > 0:
154
149
  print_subtitle_panel(OTHER_INTERESTING_EMAILS_SUBTITLE)
155
150
  console.line()
156
151
 
157
- for other_email in extra_emails:
152
+ for other_email in Document.sort_by_timestamp(extra_emails):
158
153
  console.print(other_email)
159
154
  printed_emails.append(cast(Email, other_email))
160
155
 
@@ -299,7 +294,7 @@ def _verify_all_emails_were_printed(epstein_files: EpsteinFiles, already_printed
299
294
 
300
295
  for email in epstein_files.non_duplicate_emails():
301
296
  if email.file_id not in email_ids_that_were_printed:
302
- logger.warning(f"Failed to print {email.summary()}")
297
+ logger.error(f"Failed to print {email.summary()}")
303
298
  missed_an_email = True
304
299
 
305
300
  if not missed_an_email:
@@ -26,7 +26,7 @@ from epstein_files.util.logging import logger
26
26
 
27
27
  TITLE_WIDTH = 50
28
28
  SUBTITLE_WIDTH = 110
29
- NUM_COLOR_KEY_COLS = 4
29
+ NUM_COLOR_KEY_COLS = 6
30
30
  NA_TXT = Text(NA, style='dim')
31
31
  SUBTITLE_PADDING = (2, 0, 1, 0)
32
32
  GREY_NUMBERS = [58, 39, 39, 35, 30, 27, 23, 23, 19, 19, 15, 15, 15]
@@ -179,6 +179,7 @@ def print_title_page_header() -> None:
179
179
  site_type = EMAIL if (args.all_emails or args.email_timeline) else TEXT_MESSAGE
180
180
  title = f"This is the " + ('chronological ' if args.email_timeline else '') + f"Epstein {site_type.title()}s Page"
181
181
  print_starred_header(title, num_spaces=9 if args.all_emails else 6, num_stars=14)
182
+ #print_centered(f"This page contains all of the text messages and a curated selection of emails and other files.", style='gray74')
182
183
  print_centered(f"These documents come from the Nov. 2025 House Oversight Committee release.\n", style='gray74')
183
184
  other_site_msg = "another page with" + (' all of' if other_site_type() == EMAIL else '')
184
185
  other_site_msg += f" Epstein's {other_site_type()}s also generated by this code"
@@ -290,9 +291,14 @@ def write_html(output_path: Path | None) -> None:
290
291
  logger.warning(f"Not writing HTML because args.build={args.build}.")
291
292
  return
292
293
 
293
- console.save_html(str(output_path), code_format=CONSOLE_HTML_FORMAT, theme=HTML_TERMINAL_THEME)
294
+ console.save_html(str(output_path), clear=False, code_format=CONSOLE_HTML_FORMAT, theme=HTML_TERMINAL_THEME)
294
295
  log_file_write(output_path)
295
296
 
297
+ if args.write_txt:
298
+ txt_path = f"{output_path}.txt"
299
+ console.save_text(txt_path)
300
+ log_file_write(txt_path)
301
+
296
302
 
297
303
  def _print_abbreviations_table() -> None:
298
304
  table = build_table(title="Abbreviations Used Frequently In These Conversations", show_header=False)
@@ -331,7 +337,7 @@ def _print_social_media_links() -> None:
331
337
  link_text_obj('https://universeodon.com/@cryptadamist/115572634993386057', '@mastodon', style=SOCIAL_MEDIA_LINK_STYLE),
332
338
  link_text_obj(SUBSTACK_URL, '@substack', style=SOCIAL_MEDIA_LINK_STYLE),
333
339
  link_text_obj('https://x.com/Cryptadamist/status/1990866804630036988', '@twitter', style=SOCIAL_MEDIA_LINK_STYLE),
334
- link_text_obj('https://github.com/michelcrypt4d4mus/epstein_text_messages', '@github', style=SOCIAL_MEDIA_LINK_STYLE)
340
+ link_text_obj(GH_PROJECT_URL, '@github', style=SOCIAL_MEDIA_LINK_STYLE)
335
341
  ]
336
342
 
337
343
  print_centered(join_texts(social_links, join=' / '))#, encloser='()'))#, encloser='‹›'))
@@ -197,7 +197,7 @@ def write_word_counts_html() -> None:
197
197
  email_subjects: set[str] = set()
198
198
  word_count = WordCount()
199
199
  # Remove dupes, junk mail, and fwded articles from emails
200
- emails = [e for e in epstein_files.non_duplicate_emails() if not (e.is_mailing_list() or e.is_fwded_article())]
200
+ emails = [e for e in epstein_files.non_duplicate_emails() if e.is_word_count_worthy()]
201
201
 
202
202
  for email in emails:
203
203
  if args.names and email.author not in args.names:
@@ -239,7 +239,7 @@ def write_word_counts_html() -> None:
239
239
  console.print(word_count)
240
240
  print_subtitle_panel(f"{len(COMMON_WORDS_LIST):,} Excluded Words")
241
241
  console.print(', '.join(COMMON_WORDS_LIST), highlight=False)
242
- write_html(WORD_COUNT_HTML_PATH)
242
+ write_html(WORD_COUNT_HTML_PATH if args.build else None)
243
243
  timer.print_at_checkpoint(f"Finished counting words")
244
244
 
245
245
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: epstein-files
3
- Version: 1.2.1
3
+ Version: 1.4.1
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
@@ -63,9 +63,9 @@ All the tools that come with the package require `EPSTEIN_DOCS_DIR` to be set. T
63
63
  epstein_generate
64
64
 
65
65
  # Search for a string:
66
- epstein_search Bannon
66
+ epstein_grep Bannon
67
67
  # Or a regex:
68
- epstein_search '\bSteve\s*Bannon|Jeffrey\s*Epstein\b'
68
+ epstein_grep '\bSteve\s*Bannon|Jeffrey\s*Epstein\b'
69
69
 
70
70
  # Show a file with color highlighting of keywords:
71
71
  epstein_show 030999
@@ -0,0 +1,34 @@
1
+ epstein_files/__init__.py,sha256=VQnLS19hL3v9MON6S_09pD2aGIygGDjjVntUUVqjaNU,6836
2
+ epstein_files/documents/communication.py,sha256=QiCZ35R2ttlqcdovm5LBdGqgoj4xCcpl9ANqwlA9XGU,1752
3
+ epstein_files/documents/document.py,sha256=HR9B5cVZgevnZwEwCcLsIqKPq0_A1LgtL_bELAeF5jU,19938
4
+ epstein_files/documents/email.py,sha256=oyialVOKemU5SDVdoW740pAaMHCAbgBmGI_fZKxL60U,48365
5
+ epstein_files/documents/emails/email_header.py,sha256=1msEma11rAmqCIoAZvSNstdRPvhT0c-I422x44gnGpg,8153
6
+ epstein_files/documents/imessage/text_message.py,sha256=IexwwVeF14FZqD7IuK47bIHYam07ZcD3rxheVNULNkc,3394
7
+ epstein_files/documents/json_file.py,sha256=WcZW5NNqA67rHTdopbOGtup00muNaLlvrNgKb-K4zO8,1504
8
+ epstein_files/documents/messenger_log.py,sha256=1bv62WoQMKR3gYDrK9W3Xm7cqLbKrkRBV7NTFL2cexE,7349
9
+ epstein_files/documents/other_file.py,sha256=0abFRkwT-gcL90n8yvFwcP6Bt8ZrvHkXXWx6L0q7soU,9586
10
+ epstein_files/epstein_files.py,sha256=YLz0hIlbuFZcB0rgAJ5dfR7cAESMcYKFfncGp7fuF6A,14699
11
+ epstein_files/person.py,sha256=ag6J52UJgKSsKLev2aV-0TF2MpRoE-NvOIrBHUGHHCE,15819
12
+ epstein_files/util/constant/common_words.py,sha256=C1JERPnOGHV2UMC71aEue1i9QTQog-RfT3IzdcYQOYQ,3702
13
+ epstein_files/util/constant/html.py,sha256=MFooFV8KfFBCm9hL1u6A3hi_u37i7lL6UKAYoKQj3PI,1505
14
+ epstein_files/util/constant/names.py,sha256=YCyPiBGnwp9q7VGJUBnceROwZ-OhHtIOvHZN3q3bKp0,11582
15
+ epstein_files/util/constant/output_files.py,sha256=vxof85L-1GqSwss8XvLS3HZGguyWSzJkoJm1PrYYJ7g,2123
16
+ epstein_files/util/constant/strings.py,sha256=mjRMvUcBt4rJ18kauJ3PAe7fTmqhnfIWlrtcgDVShYw,2069
17
+ epstein_files/util/constant/urls.py,sha256=rFVU7824M1gAsmWLnAr-BBVOstlVwIsgyOlUWd1cdDk,6181
18
+ epstein_files/util/constants.py,sha256=MAs4dx4q29AYR0EocnQ_mbFpwt6oAqLgKiSmqHagFDE,137197
19
+ epstein_files/util/data.py,sha256=oZSrjzQSnXHtOlqxisodpH65cTGe57TfA3sZyQQzT7Q,3051
20
+ epstein_files/util/doc_cfg.py,sha256=d1qA4KzirY4hm89B-nMnTyupoZM_cy6pZmqFyLEv_t8,9370
21
+ epstein_files/util/env.py,sha256=A6LkZoMN-ocA89fjr53jKW4vT3jPdh4xmRY6ARoFWSk,7448
22
+ epstein_files/util/file_helper.py,sha256=icU2i2j547p2a8bdv1VaECX6ie-xUjZpoT0LAXwmnJQ,3140
23
+ epstein_files/util/highlighted_group.py,sha256=g9tiKnB31lQSoTVomh1QpYO71SFRr3wxmBSLnzt7TNc,63994
24
+ epstein_files/util/logging.py,sha256=pSLHGrUnPQGFMGYNIOTbZbCyy5dDOCbNrbNz22wIcZI,2099
25
+ epstein_files/util/output.py,sha256=JMBi3MxiwmbW0qvEqA2OGt3jkw1-O3QTIiinHs3twls,12666
26
+ epstein_files/util/rich.py,sha256=-0TfLLboj_3EQx2UEsah8pjcA2c5KYHxteyzzRwW1Xc,13874
27
+ epstein_files/util/search_result.py,sha256=1fxe0KPBQXBk4dLfu6m0QXIzYfZCzvaSkWqvghJGzxY,567
28
+ epstein_files/util/timer.py,sha256=GZHefXiPA-prK-1szC1cebl44Y-i4Wd3K8zedFpcggg,1373
29
+ epstein_files/util/word_count.py,sha256=VNEVVAV1UYZTMPX55p5IaXICV6PWv7bll_Fn9SUU4is,9201
30
+ epstein_files-1.4.1.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
31
+ epstein_files-1.4.1.dist-info/METADATA,sha256=6r5ANKvheFwjyGLWYJ1HTe0RIZxJ6MDjkIO5gqmql80,6218
32
+ epstein_files-1.4.1.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
33
+ epstein_files-1.4.1.dist-info/entry_points.txt,sha256=hyNFwhAw8zyGlBOxFu9beFGqfK3l8hOJvCK1DjUw1rA,236
34
+ epstein_files-1.4.1.dist-info/RECORD,,
@@ -1,7 +1,7 @@
1
1
  [console_scripts]
2
2
  epstein_diff=epstein_files:epstein_diff
3
3
  epstein_generate=epstein_files:generate_html
4
- epstein_search=epstein_files:epstein_search
4
+ epstein_grep=epstein_files:epstein_grep
5
5
  epstein_show=epstein_files:epstein_show
6
6
  epstein_word_count=epstein_files:epstein_word_count
7
7
 
@@ -1,34 +0,0 @@
1
- epstein_files/__init__.py,sha256=zhFnPc-TFQLJIO0qnXJzDM1Bf_u8nv308GDKAvn405g,4831
2
- epstein_files/documents/communication.py,sha256=QiCZ35R2ttlqcdovm5LBdGqgoj4xCcpl9ANqwlA9XGU,1752
3
- epstein_files/documents/document.py,sha256=YwWHaiccKpYiS4UJAiGzDviyYV2hzdeee_vdX4ybhOo,19519
4
- epstein_files/documents/email.py,sha256=xc2cv6KkMfKhNLMfqW6rmDDXn1ozRChao1i98-0byI8,42297
5
- epstein_files/documents/emails/email_header.py,sha256=3UD2pXMS9bRsFP4L5RSP2tSjI8OR6lq6gPKKao0DYLY,7739
6
- epstein_files/documents/imessage/text_message.py,sha256=IexwwVeF14FZqD7IuK47bIHYam07ZcD3rxheVNULNkc,3394
7
- epstein_files/documents/json_file.py,sha256=WcZW5NNqA67rHTdopbOGtup00muNaLlvrNgKb-K4zO8,1504
8
- epstein_files/documents/messenger_log.py,sha256=1bv62WoQMKR3gYDrK9W3Xm7cqLbKrkRBV7NTFL2cexE,7349
9
- epstein_files/documents/other_file.py,sha256=xZSILlnYlX2QIYCQCm6WNHvNqhF5do6AmxT7qxw-yog,9417
10
- epstein_files/epstein_files.py,sha256=D2yMCm1IM5Skojzvvlod6yTGI_nUtNQmwmX6dzv2Egs,14057
11
- epstein_files/person.py,sha256=pESfBu2VvsLtrA86V8_D2BHKtb4m0F4xCf7tIrwyp6c,13579
12
- epstein_files/util/constant/common_words.py,sha256=C1JERPnOGHV2UMC71aEue1i9QTQog-RfT3IzdcYQOYQ,3702
13
- epstein_files/util/constant/html.py,sha256=MFooFV8KfFBCm9hL1u6A3hi_u37i7lL6UKAYoKQj3PI,1505
14
- epstein_files/util/constant/names.py,sha256=pkS1BWBxpxveHRrL1Z4muaXcK2ICIwM7RFGCsCf7Qls,11267
15
- epstein_files/util/constant/output_files.py,sha256=gUZJ4mNoeJy3qTYWr_jhSmQI-_uV_jdLR0YCiaQd_Qg,1982
16
- epstein_files/util/constant/strings.py,sha256=z_vwWxWU-_85rDTbVyo8pbi-5keBYmYnbh758n2LebU,1989
17
- epstein_files/util/constant/urls.py,sha256=UvhQP6sWqZaNnkqXFIn44oVmYLWFA-A0FGpo40Ds-MM,5651
18
- epstein_files/util/constants.py,sha256=VdOOp1azsaFgeEEO9UMS8hx5NXNP4pozfyH2IA6kW9E,121794
19
- epstein_files/util/data.py,sha256=0kCGgs3Cscbn1Q9G82bSB51CKnQpz1iUzMJoBBM34IE,2964
20
- epstein_files/util/doc_cfg.py,sha256=gIBAoeheQYqqrCtVRU2ytYu799LyCiPxPyHDgWUad3c,9471
21
- epstein_files/util/env.py,sha256=bSf2PKkOukN7LA8YdrWQS7XTRY0pLTNXo8OiQ1EKJDE,6722
22
- epstein_files/util/file_helper.py,sha256=MpG1hI7DGs05fV9KSVb_ltc98DC8tv1E_TTo5X_E7Js,3010
23
- epstein_files/util/highlighted_group.py,sha256=8uuQAHIBk7c5VYzg2xqfHsR-TGKfX7f1qdwB74UfTfI,56719
24
- epstein_files/util/logging.py,sha256=pSLHGrUnPQGFMGYNIOTbZbCyy5dDOCbNrbNz22wIcZI,2099
25
- epstein_files/util/output.py,sha256=pqTu6MApTiRKc_Q0mZzKD73UAXnAbbA5zWzGijAH4OU,12681
26
- epstein_files/util/rich.py,sha256=z9wbvNQbOJqNWm7IDBNJFgRzMP2X5CTmOgwrOkuSEJk,13639
27
- epstein_files/util/search_result.py,sha256=1fxe0KPBQXBk4dLfu6m0QXIzYfZCzvaSkWqvghJGzxY,567
28
- epstein_files/util/timer.py,sha256=GZHefXiPA-prK-1szC1cebl44Y-i4Wd3K8zedFpcggg,1373
29
- epstein_files/util/word_count.py,sha256=rs-bsSMnGG1BnYUmxYuBLZ8X0-3-jJdaB03v1jOIq4g,9202
30
- epstein_files-1.2.1.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
31
- epstein_files-1.2.1.dist-info/METADATA,sha256=_NTxSxgHoHb1uPeRlLqgxBl_9wJnyMsY2_3icXgZTDw,6222
32
- epstein_files-1.2.1.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
33
- epstein_files-1.2.1.dist-info/entry_points.txt,sha256=5qYgwAXpxegeAicD_rzda_trDRnUC51F5UVDpcZ7j6Q,240
34
- epstein_files-1.2.1.dist-info/RECORD,,