Add mac launcher, py2app setup, and build script
Co-authored-by: Copilot <[email protected]>
This commit is contained in:
1 parent
35d63c3726
commit
c77c1a6f6f
5 files changed
+96
-1
No files matched your search
@@ -30,6 +30,20 @@ docker compose up
|
||||
|
||||
Open [http://localhost:5000](http://localhost:5000) in your browser.
|
||||
|
||||
### Building a macOS .app (Standalone)
|
||||
|
||||
A convenience build script is provided to create a standalone macOS application bundle that includes a Python runtime and the app. Note: the build must be run on macOS and requires internet access to install dependencies.
|
||||
|
||||
Run the following on your Mac:
|
||||
|
||||
```bash
|
||||
chmod +x build_mac.sh
|
||||
./build_mac.sh
|
||||
```
|
||||
|
||||
The built .app will appear in dist/ (example: `dist/mac_launcher.app`). Double-click the `.app` to launch; it will start a local web server and open your default browser to the UI.
|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
1. The date range defaults to the previous week (Mon–Sat).
|
||||
|
||||
@@ -7,7 +7,7 @@ load_dotenv()
|
||||
|
||||
from clients import jellyfin
|
||||
|
||||
app = Flask(__name__)
|
||||
app = Flask(__name__, template_folder=os.path.join(os.path.dirname(__file__), 'templates'))
|
||||
|
||||
PHT = timezone(timedelta(hours=8))
|
||||
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
if [ "$(uname)" != "Darwin" ]; then
|
||||
echo "This build script must be run on macOS." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate
|
||||
|
||||
pip install --upgrade pip setuptools wheel
|
||||
pip install -r requirements.txt
|
||||
pip install py2app
|
||||
|
||||
# Build the macOS .app
|
||||
python3 setup.py py2app
|
||||
|
||||
echo "Build complete. The application bundle is in dist/ (e.g. dist/mac_launcher.app)."
|
||||
@@ -0,0 +1,40 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Launcher for macOS .app bundle: starts the Flask server bound to 127.0.0.1 and opens the default browser.
|
||||
"""
|
||||
import os
|
||||
import time
|
||||
import threading
|
||||
import webbrowser
|
||||
|
||||
# Import the Flask app defined in app.py
|
||||
from app import app
|
||||
|
||||
|
||||
def _run_server():
|
||||
port = int(os.environ.get("PORT", 5000))
|
||||
# Bind to loopback only for local use
|
||||
app.run(host="127.0.0.1", port=port, debug=False, use_reloader=False)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
t = threading.Thread(target=_run_server, daemon=True)
|
||||
t.start()
|
||||
|
||||
# Give the server a moment to start
|
||||
time.sleep(1.0)
|
||||
|
||||
port = os.environ.get("PORT", "5000")
|
||||
url = f"http://127.0.0.1:{port}/"
|
||||
try:
|
||||
webbrowser.open(url)
|
||||
except Exception:
|
||||
# If opening the browser fails, just continue; user can open manually
|
||||
pass
|
||||
|
||||
try:
|
||||
# Keep the main thread alive while the server thread runs
|
||||
while t.is_alive():
|
||||
t.join(0.5)
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
@@ -0,0 +1,22 @@
|
||||
from setuptools import setup
|
||||
|
||||
APP = ['mac_launcher.py']
|
||||
DATA_FILES = []
|
||||
OPTIONS = {
|
||||
'argv_emulation': True,
|
||||
'packages': ['clients'],
|
||||
'includes': ['jinja2', 'requests', 'dotenv'],
|
||||
'resources': ['templates'],
|
||||
'plist': {
|
||||
'CFBundleName': 'MediaEpisodesViewer',
|
||||
'CFBundleShortVersionString': '0.1.0',
|
||||
'CFBundleIdentifier': 'com.example.mediaepisodesviewer'
|
||||
}
|
||||
}
|
||||
|
||||
setup(
|
||||
app=APP,
|
||||
data_files=DATA_FILES,
|
||||
options={'py2app': OPTIONS},
|
||||
setup_requires=['py2app'],
|
||||
)
|
||||
Reference in new issue
Block a user