env angepasst
This commit is contained in:
@@ -1,5 +1,3 @@
|
|||||||
MYWHOOSH_EMAIL=
|
|
||||||
MYWHOOSH_PASSWORD=
|
|
||||||
GARMIN_EMAIL=
|
GARMIN_EMAIL=
|
||||||
GARMIN_PASSWORD=
|
GARMIN_PASSWORD=
|
||||||
|
|
||||||
@@ -7,9 +5,6 @@ POLL_INTERVAL_SECONDS=3600
|
|||||||
DATA_DIR=/data
|
DATA_DIR=/data
|
||||||
LOG_LEVEL=INFO
|
LOG_LEVEL=INFO
|
||||||
DRY_RUN=true
|
DRY_RUN=true
|
||||||
DASHBOARD_ENABLED=true
|
|
||||||
DASHBOARD_BIND=0.0.0.0
|
|
||||||
DASHBOARD_PORT=8080
|
|
||||||
|
|
||||||
MYWHOOSH_LOGIN_URL=https://www.event.mywhoosh.com/login/
|
MYWHOOSH_LOGIN_URL=https://www.event.mywhoosh.com/login/
|
||||||
MYWHOOSH_ACTIVITY_URL=https://event.mywhoosh.com/user/activities
|
MYWHOOSH_ACTIVITY_URL=https://event.mywhoosh.com/user/activities
|
||||||
@@ -17,7 +12,6 @@ MYWHOOSH_HEADLESS=true
|
|||||||
MYWHOOSH_BROWSER_STATE_DIR=/data/browser
|
MYWHOOSH_BROWSER_STATE_DIR=/data/browser
|
||||||
MYWHOOSH_AUTH_STATE_PATH=/data/mywhoosh_auth_state.json
|
MYWHOOSH_AUTH_STATE_PATH=/data/mywhoosh_auth_state.json
|
||||||
MYWHOOSH_TIMEOUT_SECONDS=45
|
MYWHOOSH_TIMEOUT_SECONDS=45
|
||||||
MYWHOOSH_MAX_DOWNLOADS_PER_RUN=10
|
|
||||||
MYWHOOSH_DOWNLOAD_TEXT_HINTS=fit,download
|
MYWHOOSH_DOWNLOAD_TEXT_HINTS=fit,download
|
||||||
MYWHOOSH_ACTIVITIES_BUTTON_TEXT=ACTIVITIES
|
MYWHOOSH_ACTIVITIES_BUTTON_TEXT=ACTIVITIES
|
||||||
MYWHOOSH_DOWNLOAD_BUTTON_SELECTOR=.btnDownload
|
MYWHOOSH_DOWNLOAD_BUTTON_SELECTOR=.btnDownload
|
||||||
|
|||||||
22
README.md
22
README.md
@@ -18,6 +18,26 @@ cp .env.example .env
|
|||||||
|
|
||||||
Edit `.env`, then run:
|
Edit `.env`, then run:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker compose -f docker-compose.debug.yml up --build
|
||||||
|
```
|
||||||
|
|
||||||
|
If this runs on a remote Linux server, keep the default localhost-only port binding and tunnel it:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ssh -L 6080:localhost:6080 user@your-server
|
||||||
|
```
|
||||||
|
|
||||||
|
Then open noVNC:
|
||||||
|
|
||||||
|
```text
|
||||||
|
http://localhost:6080/vnc.html
|
||||||
|
```
|
||||||
|
|
||||||
|
Login into your MyWhoosh account with keep me signed in (Important!).
|
||||||
|
Exit.
|
||||||
|
|
||||||
|
Start the production container
|
||||||
```sh
|
```sh
|
||||||
docker compose up -d --build
|
docker compose up -d --build
|
||||||
docker compose logs -f sync
|
docker compose logs -f sync
|
||||||
@@ -30,8 +50,6 @@ The default polling interval is hourly.
|
|||||||
Required values:
|
Required values:
|
||||||
|
|
||||||
```env
|
```env
|
||||||
MYWHOOSH_EMAIL=
|
|
||||||
MYWHOOSH_PASSWORD=
|
|
||||||
GARMIN_EMAIL=
|
GARMIN_EMAIL=
|
||||||
GARMIN_PASSWORD=
|
GARMIN_PASSWORD=
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -44,8 +44,6 @@ def _required_env(name: str) -> str:
|
|||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
class Settings:
|
class Settings:
|
||||||
mywhoosh_email: str
|
|
||||||
mywhoosh_password: str
|
|
||||||
garmin_email: str
|
garmin_email: str
|
||||||
garmin_password: str
|
garmin_password: str
|
||||||
|
|
||||||
@@ -59,15 +57,11 @@ class Settings:
|
|||||||
db_path: Path
|
db_path: Path
|
||||||
log_level: str
|
log_level: str
|
||||||
dry_run: bool
|
dry_run: bool
|
||||||
dashboard_enabled: bool
|
|
||||||
dashboard_bind: str
|
|
||||||
dashboard_port: int
|
|
||||||
|
|
||||||
mywhoosh_login_url: str
|
mywhoosh_login_url: str
|
||||||
mywhoosh_activity_url: str
|
mywhoosh_activity_url: str
|
||||||
mywhoosh_headless: bool
|
mywhoosh_headless: bool
|
||||||
mywhoosh_timeout_seconds: int
|
mywhoosh_timeout_seconds: int
|
||||||
mywhoosh_max_downloads_per_run: int
|
|
||||||
mywhoosh_download_text_hints: list[str]
|
mywhoosh_download_text_hints: list[str]
|
||||||
mywhoosh_activities_button_text: str
|
mywhoosh_activities_button_text: str
|
||||||
mywhoosh_download_button_selector: str
|
mywhoosh_download_button_selector: str
|
||||||
@@ -89,8 +83,6 @@ class Settings:
|
|||||||
|
|
||||||
data_dir = Path(os.getenv("DATA_DIR", "/data"))
|
data_dir = Path(os.getenv("DATA_DIR", "/data"))
|
||||||
return cls(
|
return cls(
|
||||||
mywhoosh_email=_required_env("MYWHOOSH_EMAIL"),
|
|
||||||
mywhoosh_password=_required_env("MYWHOOSH_PASSWORD"),
|
|
||||||
garmin_email=_required_env("GARMIN_EMAIL"),
|
garmin_email=_required_env("GARMIN_EMAIL"),
|
||||||
garmin_password=_required_env("GARMIN_PASSWORD"),
|
garmin_password=_required_env("GARMIN_PASSWORD"),
|
||||||
poll_interval_seconds=_int_env("POLL_INTERVAL_SECONDS", 3600),
|
poll_interval_seconds=_int_env("POLL_INTERVAL_SECONDS", 3600),
|
||||||
@@ -114,9 +106,6 @@ class Settings:
|
|||||||
db_path=Path(os.getenv("STATE_DB", str(data_dir / "state.sqlite3"))),
|
db_path=Path(os.getenv("STATE_DB", str(data_dir / "state.sqlite3"))),
|
||||||
log_level=os.getenv("LOG_LEVEL", "INFO").upper(),
|
log_level=os.getenv("LOG_LEVEL", "INFO").upper(),
|
||||||
dry_run=_bool_env("DRY_RUN", False),
|
dry_run=_bool_env("DRY_RUN", False),
|
||||||
dashboard_enabled=_bool_env("DASHBOARD_ENABLED", True),
|
|
||||||
dashboard_bind=os.getenv("DASHBOARD_BIND", "0.0.0.0"),
|
|
||||||
dashboard_port=_int_env("DASHBOARD_PORT", 8080),
|
|
||||||
mywhoosh_login_url=os.getenv(
|
mywhoosh_login_url=os.getenv(
|
||||||
"MYWHOOSH_LOGIN_URL", "https://www.mywhoosh.com/login/"
|
"MYWHOOSH_LOGIN_URL", "https://www.mywhoosh.com/login/"
|
||||||
),
|
),
|
||||||
@@ -125,9 +114,6 @@ class Settings:
|
|||||||
),
|
),
|
||||||
mywhoosh_headless=_bool_env("MYWHOOSH_HEADLESS", True),
|
mywhoosh_headless=_bool_env("MYWHOOSH_HEADLESS", True),
|
||||||
mywhoosh_timeout_seconds=_int_env("MYWHOOSH_TIMEOUT_SECONDS", 45),
|
mywhoosh_timeout_seconds=_int_env("MYWHOOSH_TIMEOUT_SECONDS", 45),
|
||||||
mywhoosh_max_downloads_per_run=_int_env(
|
|
||||||
"MYWHOOSH_MAX_DOWNLOADS_PER_RUN", 10
|
|
||||||
),
|
|
||||||
mywhoosh_download_text_hints=_csv_env(
|
mywhoosh_download_text_hints=_csv_env(
|
||||||
"MYWHOOSH_DOWNLOAD_TEXT_HINTS", ["fit", "download"]
|
"MYWHOOSH_DOWNLOAD_TEXT_HINTS", ["fit", "download"]
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -93,8 +93,6 @@ class MyWhooshCrawler:
|
|||||||
|
|
||||||
downloaded: list[DownloadedActivity] = []
|
downloaded: list[DownloadedActivity] = []
|
||||||
for candidate in candidates:
|
for candidate in candidates:
|
||||||
if len(downloaded) >= self.settings.mywhoosh_max_downloads_per_run:
|
|
||||||
break
|
|
||||||
if should_skip_source(candidate.source_ref):
|
if should_skip_source(candidate.source_ref):
|
||||||
logger.debug("Skipping already terminal source %s", candidate.source_ref)
|
logger.debug("Skipping already terminal source %s", candidate.source_ref)
|
||||||
continue
|
continue
|
||||||
@@ -136,10 +134,6 @@ class MyWhooshCrawler:
|
|||||||
password_selector = 'input[type="password"], input[autocomplete="current-password"]'
|
password_selector = 'input[type="password"], input[autocomplete="current-password"]'
|
||||||
|
|
||||||
try:
|
try:
|
||||||
await page.locator(email_selector).first.fill(self.settings.mywhoosh_email)
|
|
||||||
await page.locator(password_selector).first.fill(
|
|
||||||
self.settings.mywhoosh_password
|
|
||||||
)
|
|
||||||
await self._dismiss_cookie_banner(page)
|
await self._dismiss_cookie_banner(page)
|
||||||
|
|
||||||
submit = page.locator(
|
submit = page.locator(
|
||||||
|
|||||||
@@ -22,14 +22,10 @@ def settings(tmp_path: Path) -> Settings:
|
|||||||
db_path=tmp_path / "state.sqlite3",
|
db_path=tmp_path / "state.sqlite3",
|
||||||
log_level="INFO",
|
log_level="INFO",
|
||||||
dry_run=False,
|
dry_run=False,
|
||||||
dashboard_enabled=True,
|
|
||||||
dashboard_bind="127.0.0.1",
|
|
||||||
dashboard_port=8080,
|
|
||||||
mywhoosh_login_url="https://www.mywhoosh.com/login/",
|
mywhoosh_login_url="https://www.mywhoosh.com/login/",
|
||||||
mywhoosh_activity_url="https://www.mywhoosh.com/profile/",
|
mywhoosh_activity_url="https://www.mywhoosh.com/profile/",
|
||||||
mywhoosh_headless=True,
|
mywhoosh_headless=True,
|
||||||
mywhoosh_timeout_seconds=1,
|
mywhoosh_timeout_seconds=1,
|
||||||
mywhoosh_max_downloads_per_run=10,
|
|
||||||
mywhoosh_download_text_hints=["fit", "download"],
|
mywhoosh_download_text_hints=["fit", "download"],
|
||||||
mywhoosh_activities_button_text="ACTIVITIES",
|
mywhoosh_activities_button_text="ACTIVITIES",
|
||||||
mywhoosh_download_button_selector=".btnDownload",
|
mywhoosh_download_button_selector=".btnDownload",
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ from mywhoosh_garmin_sync.config import Settings
|
|||||||
|
|
||||||
|
|
||||||
def test_settings_from_env(monkeypatch, tmp_path):
|
def test_settings_from_env(monkeypatch, tmp_path):
|
||||||
monkeypatch.setenv("MYWHOOSH_EMAIL", "whoosh@example.com")
|
|
||||||
monkeypatch.setenv("MYWHOOSH_PASSWORD", "whoosh-pass")
|
monkeypatch.setenv("MYWHOOSH_PASSWORD", "whoosh-pass")
|
||||||
monkeypatch.setenv("GARMIN_EMAIL", "garmin@example.com")
|
monkeypatch.setenv("GARMIN_EMAIL", "garmin@example.com")
|
||||||
monkeypatch.setenv("GARMIN_PASSWORD", "garmin-pass")
|
monkeypatch.setenv("GARMIN_PASSWORD", "garmin-pass")
|
||||||
@@ -20,9 +19,6 @@ def test_settings_from_env(monkeypatch, tmp_path):
|
|||||||
assert settings.raw_dir == tmp_path / "raw"
|
assert settings.raw_dir == tmp_path / "raw"
|
||||||
assert settings.dry_run is True
|
assert settings.dry_run is True
|
||||||
assert settings.poll_interval_seconds == 123
|
assert settings.poll_interval_seconds == 123
|
||||||
assert settings.dashboard_enabled is True
|
|
||||||
assert settings.dashboard_bind == "0.0.0.0"
|
|
||||||
assert settings.dashboard_port == 8080
|
|
||||||
assert settings.target_garmin_product_id == 3578
|
assert settings.target_garmin_product_id == 3578
|
||||||
assert settings.target_garmin_serial_number == 123456
|
assert settings.target_garmin_serial_number == 123456
|
||||||
assert settings.mywhoosh_manual_login_wait_seconds == 900
|
assert settings.mywhoosh_manual_login_wait_seconds == 900
|
||||||
|
|||||||
Reference in New Issue
Block a user