Skip to content

Commit 66c4aa7

Browse files
committed
Retire Storebaelt webcam publisher
1 parent cbe16fa commit 66c4aa7

8 files changed

Lines changed: 91 additions & 3 deletions

docs/research/new-publisher-source-planning/Storebaelt_On_Demand_Live_Webcam_Enhancement_Plan_2026-06-03.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# Storebaelt On-Demand Live Webcam Enhancement Plan
22

3+
> **Retired 2026-06-04:** Do not proceed with this Storebaelt-specific plan. Storebaelt/Sund & Baelt replied to the permission request that the webcam service is being shut down and cannot be used as an OGC CSAPI demonstration case. See `Storebaelt_Source_Retirement_Disposition_2026-06-04.md`.
4+
35
**Date:** 2026-06-03
46
**Scope:** Demand-driven live/HLS enhancement for the Storebaelt webcam publisher and Explorer UI.
57
**Related background:**

docs/research/new-publisher-source-planning/Storebaelt_Phase_1_Freshness_First_Execution_Plan_2026-06-03.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# Storebaelt Phase 1 Freshness-First Execution Plan
22

3+
> **Retired 2026-06-04:** Phase 1 was implemented and then the Storebaelt source was retired after the provider replied that the webcam service is being shut down and cannot be used as an OGC CSAPI demonstration case. See `Storebaelt_Source_Retirement_Disposition_2026-06-04.md`.
4+
35
**Date:** 2026-06-03
46
**Scope:** Recommended next implementation step for the Storebaelt webcam publisher and Explorer UI.
57
**Decision:** Do the poster/freshness hardening first, and keep it separate from the later on-demand live/HLS webcam enhancement.

docs/research/new-publisher-source-planning/Storebaelt_Phase_2A_Live_Playback_Reconnaissance_2026-06-03.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# Storebaelt Phase 2A Live Playback Reconnaissance
22

3+
> **Retired 2026-06-04:** Keep this as historical reconnaissance only. Storebaelt/Sund & Baelt replied that the webcam service is being shut down and cannot be used as an OGC CSAPI demonstration case. See `Storebaelt_Source_Retirement_Disposition_2026-06-04.md`.
4+
35
**Date:** 2026-06-03
46
**Scope:** Validate the cheapest live-video paths before building backend HLS lease/frame extraction services.
57

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# Storebaelt Source Retirement Disposition
2+
3+
**Date:** 2026-06-04
4+
**Decision:** Retire Storebaelt webcams as an active public OS4CSAPI/OSH publisher source.
5+
6+
## Permission Request Outcome
7+
8+
Sam Bolling requested permission and usage guidance from Storebaelt/Sund & Baelt for limited, non-commercial OGC API - Connected Systems standards-evaluation use of the publicly visible Storebaelt webcam data.
9+
10+
Lene Gebauer Thomsen, Head of Corporate Communication at Sund & Baelt Holding A/S, replied that she administers the service and that Storebaelt is in the process of shutting it down. Her response stated that it will not be possible to use the service as a case for the project.
11+
12+
The response is not an approval with conditions. Treat it as a provider refusal for this demonstration use case, plus an operational warning that the source is going away.
13+
14+
## Actions Taken
15+
16+
- Stopped and disabled `storebaelt-webcams-publisher.service` on the Oracle host.
17+
- Removed the Storebaelt camera deployments, grouping deployments, systems, and procedure from the public OSH/CSAPI instance using the package cleanup path.
18+
- Verified the service is inactive and disabled.
19+
- Verified cleanup dry-run finds no remaining Storebaelt resources.
20+
- Archived the Storebaelt publisher entry points behind `STOREBAELT_WEBCAMS_ALLOW_ARCHIVED=1` so they cannot be accidentally restarted as an active public source.
21+
22+
## Retained Value
23+
24+
The implementation remains useful as historical engineering evidence for:
25+
26+
- camera/media source modeling in CSAPI;
27+
- poster-image freshness heartbeat semantics;
28+
- separating source-check time from image-content change time;
29+
- strict SWE result field ordering;
30+
- datastream schema immutability after observations;
31+
- Explorer UX patterns for distinguishing a still poster from a live provider player;
32+
- permission-review workflow for public media sources.
33+
34+
## Replacement Source Criteria
35+
36+
Do not select a replacement webcam/media source for public demonstration unless at least one of these is true:
37+
38+
- the provider gives explicit permission;
39+
- the source has an open data/media license allowing the intended use;
40+
- the source has documented API or reuse terms allowing media integration;
41+
- the source is a government/public-domain source with clear reuse permissions.
42+
43+
For future media publishers, prefer CSAPI-native metadata, freshness, and health observations first. Add live playback, snapshots, or stream relay only when the provider terms clearly allow the chosen media use.

docs/research/new-publisher-source-planning/Storebaelt_Webcam_Poster_Integration_Status_and_UX_Options_2026-06-03.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# Storebaelt Webcam Poster Integration Status and UX Options
22

3+
> **Retired 2026-06-04:** The integration was removed from the public OSH demo after Storebaelt/Sund & Baelt replied that the webcam service is being shut down and cannot be used as an OGC CSAPI demonstration case. See `Storebaelt_Source_Retirement_Disposition_2026-06-04.md`.
4+
35
**Date:** 2026-06-03
46
**Scope:** Storebaelt public traffic/weather webcam publisher behavior, image freshness semantics, and UI/UX optimization options.
57

publishers/storebaelt_webcams/README.md

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Storebaelt Webcams Publisher
22

3+
> Archived 2026-06-04: do not run this publisher as an active public source.
4+
> Storebaelt/Sund & Baelt replied to the permission request that the webcam service is being shut down and cannot be used as an OGC CSAPI demonstration case. The public Oracle publisher has been stopped/disabled and the CSAPI resources have been removed. This package remains only as a historical implementation pattern for camera metadata, poster freshness, and SWE field-order handling.
5+
36
Publishes image-reference observations for the public Storebaelt traffic/weather webcams.
47

58
The source is an embedded live-video page, not a JSON API. The publisher uses the stable poster JPEG URLs exposed by the Mediathand player pages as the first ingestion target and preserves the public page and player URLs as provenance.
@@ -12,13 +15,19 @@ The source is an embedded live-video page, not a JSON API. The publisher uses th
1215
## Bootstrap
1316

1417
```bash
15-
python -m publishers.storebaelt_webcams.bootstrap_storebaelt_webcams
18+
STOREBAELT_WEBCAMS_ALLOW_ARCHIVED=1 python -m publishers.storebaelt_webcams.bootstrap_storebaelt_webcams
19+
```
20+
21+
Clean-only teardown remains available without the archive override:
22+
23+
```bash
24+
python -m publishers.storebaelt_webcams.bootstrap_storebaelt_webcams --clean-only
1625
```
1726

1827
## Run
1928

2029
```bash
21-
python -m publishers.storebaelt_webcams.storebaelt_webcams_publisher --interval 300
30+
STOREBAELT_WEBCAMS_ALLOW_ARCHIVED=1 python -m publishers.storebaelt_webcams.storebaelt_webcams_publisher --interval 300
2231
```
2332

24-
Use `--dry-run --once` to inspect observations without posting.
33+
Use `--dry-run --once` only for controlled historical testing.

publishers/storebaelt_webcams/bootstrap_storebaelt_webcams.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,20 @@
3131
STOREBAELT_HOME = "https://storebaelt.dk/"
3232
STOREBAELT_WEBCAMS_PAGE = "https://storebaelt.dk/trafik-vejr/webcams/"
3333
STOREBAELT_OPERATOR = "A/S Storebaelt"
34+
ARCHIVE_OVERRIDE_ENV = "STOREBAELT_WEBCAMS_ALLOW_ARCHIVED"
35+
ARCHIVE_MESSAGE = (
36+
"Storebaelt webcam resources are archived and must not be bootstrapped as an active public source. "
37+
"The provider replied on 2026-06-04 that the service is being shut down and cannot be used "
38+
"as an OGC CSAPI demonstration case. Clean-only teardown remains allowed; set "
39+
"STOREBAELT_WEBCAMS_ALLOW_ARCHIVED=1 only for controlled historical testing."
40+
)
41+
42+
43+
def _require_archive_override_for_bootstrap(clean_only: bool):
44+
if clean_only:
45+
return
46+
if os.environ.get(ARCHIVE_OVERRIDE_ENV) != "1":
47+
raise SystemExit(f"ERROR: {ARCHIVE_MESSAGE}")
3448

3549

3650
def _load_cameras() -> list[dict]:
@@ -262,6 +276,7 @@ def clean_all(base_url: str, auth: str, *, dry_run: bool, stats: dict):
262276

263277

264278
def bootstrap(*, clean: bool = False, clean_only: bool = False, dry_run: bool = False, force_sml: bool = False):
279+
_require_archive_override_for_bootstrap(clean_only)
265280
config = get_config()
266281
base_url = config["base_url"]
267282
auth = _auth_header(config["user"], config["password"])

publishers/storebaelt_webcams/storebaelt_webcams_publisher.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,18 @@
2222
USER_AGENT = "OS4CSAPI Storebaelt Webcams Publisher/1.0"
2323
DS_OUTPUT_NAME = "storebaeltWebcamImage"
2424
DEFAULT_STALE_SECONDS = 15 * 60
25+
ARCHIVE_OVERRIDE_ENV = "STOREBAELT_WEBCAMS_ALLOW_ARCHIVED"
26+
ARCHIVE_MESSAGE = (
27+
"Storebaelt webcams publisher is archived and must not be run as an active public source. "
28+
"The provider replied on 2026-06-04 that the service is being shut down and cannot be used "
29+
"as an OGC CSAPI demonstration case. Set STOREBAELT_WEBCAMS_ALLOW_ARCHIVED=1 only for "
30+
"controlled historical testing."
31+
)
32+
33+
34+
def _require_archive_override():
35+
if os.environ.get(ARCHIVE_OVERRIDE_ENV) != "1":
36+
raise SystemExit(f"ERROR: {ARCHIVE_MESSAGE}")
2537

2638

2739
def _load_cameras() -> list[dict]:
@@ -367,6 +379,7 @@ def main():
367379
parser.add_argument("--once", action="store_true", help="Publish one cycle then exit")
368380
parser.add_argument("--cameras", type=str, default=None, help="Comma-separated camera IDs to publish")
369381
args = parser.parse_args()
382+
_require_archive_override()
370383
camera_filter = args.cameras.split(",") if args.cameras else None
371384
StorebaeltWebcamsPublisher(camera_filter=camera_filter).run(interval=args.interval, dry_run=args.dry_run, once=args.once)
372385

0 commit comments

Comments
 (0)