talks-reducer 0.8.1__tar.gz → 0.8.2__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.
- {talks_reducer-0.8.1/talks_reducer.egg-info → talks_reducer-0.8.2}/PKG-INFO +1 -1
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/__about__.py +1 -1
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/gui/startup.py +32 -0
- talks_reducer-0.8.2/talks_reducer/pyinstaller_hooks/tkinter_env.py +52 -0
- talks_reducer-0.8.2/talks_reducer/resources/__init__.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2/talks_reducer.egg-info}/PKG-INFO +1 -1
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer.egg-info/SOURCES.txt +2 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/LICENSE +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/README.md +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/pyproject.toml +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/setup.cfg +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/__init__.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/__main__.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/audio.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/chunks.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/cli.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/discovery.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/ffmpeg.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/gui/__init__.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/gui/__main__.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/gui/app.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/gui/discovery.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/gui/layout.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/gui/preferences.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/gui/progress.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/gui/remote.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/gui/theme.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/icons.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/models.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/pipeline.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/progress.py +0 -0
- {talks_reducer-0.8.1/talks_reducer/resources → talks_reducer-0.8.2/talks_reducer/pyinstaller_hooks}/__init__.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/resources/icons/app-256.png +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/resources/icons/app.icns +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/resources/icons/app.ico +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/server.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/server_tray.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/service_client.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer/version_utils.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer.egg-info/dependency_links.txt +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer.egg-info/entry_points.txt +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer.egg-info/requires.txt +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/talks_reducer.egg-info/top_level.txt +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/tests/test_audio.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/tests/test_chunks.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/tests/test_cli.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/tests/test_discovery.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/tests/test_entrypoints.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/tests/test_ffmpeg.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/tests/test_gui_app.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/tests/test_gui_discovery.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/tests/test_gui_layout.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/tests/test_gui_preferences.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/tests/test_gui_progress.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/tests/test_gui_remote.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/tests/test_gui_startup.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/tests/test_gui_summary_parsing.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/tests/test_gui_theme.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/tests/test_icons.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/tests/test_models_version.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/tests/test_pipeline.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/tests/test_pipeline_service.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/tests/test_progress.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/tests/test_server.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/tests/test_server_tray.py +0 -0
- {talks_reducer-0.8.1 → talks_reducer-0.8.2}/tests/test_service_client.py +0 -0
@@ -5,6 +5,7 @@ from __future__ import annotations
|
|
5
5
|
import argparse
|
6
6
|
import importlib
|
7
7
|
import json
|
8
|
+
import platform
|
8
9
|
import subprocess
|
9
10
|
import sys
|
10
11
|
from pathlib import Path
|
@@ -13,6 +14,32 @@ from typing import Optional, Sequence, Tuple
|
|
13
14
|
from ..cli import main as cli_main
|
14
15
|
from .app import TalksReducerGUI
|
15
16
|
|
17
|
+
_runtime_logged = False
|
18
|
+
|
19
|
+
|
20
|
+
def _log_python_runtime() -> None:
|
21
|
+
"""Emit the active Python runtime details once for troubleshooting."""
|
22
|
+
|
23
|
+
global _runtime_logged
|
24
|
+
if _runtime_logged:
|
25
|
+
return
|
26
|
+
|
27
|
+
_runtime_logged = True
|
28
|
+
|
29
|
+
try:
|
30
|
+
implementation = platform.python_implementation()
|
31
|
+
except Exception: # pragma: no cover - extremely defensive fallback
|
32
|
+
implementation = "Python"
|
33
|
+
|
34
|
+
try:
|
35
|
+
version = platform.python_version()
|
36
|
+
except Exception: # pragma: no cover - platform module unavailable
|
37
|
+
version = sys.version.split()[0]
|
38
|
+
|
39
|
+
sys.stdout.write(
|
40
|
+
f"[Talks Reducer] Runtime: {implementation} {version} (executable: {sys.executable})\n"
|
41
|
+
)
|
42
|
+
|
16
43
|
|
17
44
|
def _check_tkinter_available() -> Tuple[bool, str]:
|
18
45
|
"""Check if tkinter can create windows without importing it globally."""
|
@@ -88,6 +115,8 @@ if __name__ == "__main__":
|
|
88
115
|
def main(argv: Optional[Sequence[str]] = None) -> bool:
|
89
116
|
"""Launch the GUI when run without arguments, otherwise defer to the CLI."""
|
90
117
|
|
118
|
+
_log_python_runtime()
|
119
|
+
|
91
120
|
if argv is None:
|
92
121
|
argv = sys.argv[1:]
|
93
122
|
|
@@ -123,6 +152,9 @@ def main(argv: Optional[Sequence[str]] = None) -> bool:
|
|
123
152
|
)
|
124
153
|
argv = remaining
|
125
154
|
|
155
|
+
if sys.platform == "darwin":
|
156
|
+
argv = [arg for arg in argv if not arg.startswith("-psn_")]
|
157
|
+
|
126
158
|
if argv:
|
127
159
|
launch_gui = False
|
128
160
|
if sys.platform == "win32" and not any(arg.startswith("-") for arg in argv):
|
@@ -0,0 +1,52 @@
|
|
1
|
+
"""PyInstaller runtime hook ensuring Tcl/Tk uses bundled resources."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
import os
|
6
|
+
import sys
|
7
|
+
from pathlib import Path
|
8
|
+
|
9
|
+
|
10
|
+
def _select_latest(directory: Path, prefix: str) -> Path | None:
|
11
|
+
"""Pick the newest matching child directory within *directory*."""
|
12
|
+
|
13
|
+
if not directory.exists() or not directory.is_dir():
|
14
|
+
return None
|
15
|
+
|
16
|
+
candidates = [child for child in directory.iterdir() if child.is_dir() and child.name.lower().startswith(prefix)]
|
17
|
+
if not candidates:
|
18
|
+
return None
|
19
|
+
|
20
|
+
def sort_key(item: Path) -> float:
|
21
|
+
try:
|
22
|
+
return item.stat().st_mtime
|
23
|
+
except OSError:
|
24
|
+
return 0.0
|
25
|
+
|
26
|
+
candidates.sort(key=sort_key, reverse=True)
|
27
|
+
return candidates[0]
|
28
|
+
|
29
|
+
|
30
|
+
def configure_tk_paths() -> None:
|
31
|
+
"""Set Tcl/Tk environment variables when running from a PyInstaller bundle."""
|
32
|
+
|
33
|
+
if not getattr(sys, "frozen", False):
|
34
|
+
return
|
35
|
+
|
36
|
+
base = getattr(sys, "_MEIPASS", None)
|
37
|
+
if not base:
|
38
|
+
return
|
39
|
+
|
40
|
+
bundle_root = Path(base)
|
41
|
+
|
42
|
+
tcl_dir = _select_latest(bundle_root / "tcl", "tcl")
|
43
|
+
tk_dir = _select_latest(bundle_root / "tk", "tk")
|
44
|
+
|
45
|
+
if tcl_dir and "TCL_LIBRARY" not in os.environ:
|
46
|
+
os.environ["TCL_LIBRARY"] = str(tcl_dir)
|
47
|
+
|
48
|
+
if tk_dir and "TK_LIBRARY" not in os.environ:
|
49
|
+
os.environ["TK_LIBRARY"] = str(tk_dir)
|
50
|
+
|
51
|
+
|
52
|
+
configure_tk_paths()
|
File without changes
|
@@ -33,6 +33,8 @@ talks_reducer/gui/progress.py
|
|
33
33
|
talks_reducer/gui/remote.py
|
34
34
|
talks_reducer/gui/startup.py
|
35
35
|
talks_reducer/gui/theme.py
|
36
|
+
talks_reducer/pyinstaller_hooks/__init__.py
|
37
|
+
talks_reducer/pyinstaller_hooks/tkinter_env.py
|
36
38
|
talks_reducer/resources/__init__.py
|
37
39
|
talks_reducer/resources/icons/app-256.png
|
38
40
|
talks_reducer/resources/icons/app.icns
|
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
|
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
|
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
|
File without changes
|
File without changes
|