Skip to content

feat(cctv): add verified official Denmark webcam batch 2 - #39

Merged
carbon-evolution merged 35 commits into
carbon-evolution:mainfrom
morein1:denmark-cams-official-batch2
Oct 18, 2026
Merged

carbon-evolution merged 35 commits into
carbon-evolution:mainfrom
morein1:denmark-cams-official-batch2

Conversation

@morein1

@morein1 morein1 commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • replace generic Denmark webcam-directory entries with verified operator-published sources
  • add 3 official Polyteknisk Flyvegruppe cameras at Kalundborg Flyveplads
  • add 2 official Læsø Flyveplads webcam views from Læsø Kommune
  • replace Juelsminde with 8 official direct JPEG webcams from Juelsminde Havn & Marina
  • replace Svendborg Golf with the club's official live player
  • replace Marina Minde with 4 official direct JPEG webcam views
  • replace Nivå with the official Nivå Havn og Strandpark webcam page
  • replace Rungsted Marina with Rungsted Havn's official live-webcam page
  • replace Køge Marina with Køge Marina's official LIVE TV2 weather-camera page
  • replace Hirtshals Harbour with 2 official Port of Hirtshals JPEG webcam views (north/east)
  • replace Anholt Harbour with Anholt Havn's official livestream page
  • replace Hvide Sande Sportsfisker Center with its official webcam page
  • replace the generic Hvide Sande Kabelpark marker with 2 official livecam markers
  • replace the generic Lyngvig Fyr marker with Ringkøbing Fjord Museer's official lighthouse webcam page
  • replace Marselisborghavn with the marina's own official Live Cam page
  • replace Hellerup Sejlklub with the club's official Vejr & Webcam page
  • replace the generic TV2-labelled Rønne marker with TV 2/Bornholm's official Rønne webcam page
  • replace the generic Lynetteholm construction listing with By & Havn's official live construction-site page
  • replace the single generic Skive Flyveklub marker with 3 public webcam views published by Skive Lufthavn
  • replace the generic Rønnede / Øst-Sjællands Flyveklub marker with 2 official direct JPEG webcam views (north/east)
  • replace the generic Randers Airport listing with Randers Flyveklub's official EKRD webcam page
  • replace the generic Gribskov osprey listing with Naturstyrelsen's official seasonal osprey livestream page
  • replace the generic GIVSKUD ZOO listing with the zoo's own live entrance/queue camera page
  • replace the generic Gilleleje Golfklub listing with the club's official course-status webcam page
  • replace the generic Køge golf-course listing with Køge Golf Klub's official livestream from 1. tee
  • replace the generic Padborg / Vesterbæk motocross listing with Vesterbæk Moto Cross Club's official Webcam page
  • replace the generic Sletterhage lighthouse listing with Sletterhage Fyrs Venner's official live webcam page
  • add GeoCenter Møns Klint's official 24/7 Dronningestolen webcam as a new verified marker
  • replace Lihme / Gyldendal Havn with the harbour's own official live webcam page
  • replace the generic Orø / Østre Færge listing with Østre Færge A/S's official Webcam/vind page
  • replace the generic Øresund Bridge listing with 2 official Øresundsbron pylon-camera views (west/east)
  • remove stale Vesterø Havn, Hundested Havn and Frederikshavn Havn third-party listings where the operator no longer provides a working public webcam
  • preserve the existing Denmark catalogue and layer official-source upgrades on top

Verification

  • PFG endpoints returned current JPEG frames on 2026-10-17
  • Læsø Kommune publishes both webcam images on its official flyveplads page
  • Juelsminde publishes 8 distinct direct JPEG endpoints
  • Marina Minde publishes 4 direct JPEG endpoints
  • Nivå and Rungsted are intentionally linked to official operator pages where third-party embedding would otherwise be brittle or restricted
  • Køge Marina explicitly describes its TV2 weather camera as LIVE
  • Port of Hirtshals publishes two official public webcam images; both direct endpoints returned HTTP 200 image/jpeg during verification on 2026-10-17
  • Anholt Havn describes its webcam as livestreaming/current conditions; its current player is cookie-gated, so OSIRIS links to the official webcam section
  • Hvide Sande Sportsfisker Center exposes a dedicated official webcam page with a public YouTube player
  • Kabelpark Hvide Sande publishes two live webcam embeds on its official Livecams page
  • Ringkøbing Fjord Museer publishes the Lyngvig Fyr webcam on the official lighthouse page in collaboration with Esmark
  • Marselisborg Havn publishes an official page titled Live Cam; no stable direct media URL was exposed to the verifier, so OSIRIS links to that official page
  • Hellerup Sejlklub publishes an official Vejr & Webcam page with its public webcam
  • TV 2/Bornholm's weather page publishes a Rønne webcam and describes the view across Zahrtmannsvej, Rønne Havn and the old town; the separate generic Rønne Havn marker is intentionally left untouched because it may be a different camera
  • By & Havn's current Lynetteholm construction page explicitly publishes “Live fra byggepladsen” and a project page exposes the construction webcam
  • Skive Lufthavn's official webcam page publishes 3 public IPCamLive player links: tower/apron, apron/runway and tower/runway/windsock
  • Øst-Sjællands Flyveklub's official webcam page publishes 2 direct HTTPS JPEG snapshots; both returned HTTP 200 image/jpeg on 2026-10-17 and the page states that they refresh once per minute
  • Randers Flyveklub publishes a dedicated EKRD webcam page on its own domain
  • Naturstyrelsen states that the Gribskov osprey nest is livestreamed from its own webcam, normally during the breeding season; OSIRIS links to the official agency page rather than the generic directory
  • WorldCam's Givskud listing describes the zoo parking/access road, while GIVSKUD ZOO's own queue-barometer page publishes live video from the entrance; the operator page therefore replaces the generic directory entry
  • Gilleleje Golfklub's current Banestatus page explicitly includes “Banen lige NU – webcam (starterhus og 1. tee)”, so the official club page replaces the generic directory entry
  • Køge Golf Klub's current site explicitly advertises “Livestream fra 1. tee”, and its course page identifies the webcam view toward the starter house
  • Vesterbæk Moto Cross Club's current facilities page explicitly includes “Webcam” and identifies the club at Tøndervej 45, 6330 Padborg
  • Sletterhage Fyrs Venner embeds a public IPCamLive player directly on the official lighthouse homepage
  • GeoCenter Møns Klint states that its webcam livestreams the view from Dronningestolen 24/7; the official Møns Klint UNESCO nomination dossier gives Dronningestolen as N 54°58'04” E 12°33'01”, which is used for the marker
  • Gyldendal Havn publishes an official page titled “Webcam – Oplev havnen live”, so its operator page replaces the generic Lihme / Gyldendal listing
  • Østre Færge A/S publishes an official Webcam/vind page with public views of both Østre Færge and Karen Orø; OSIRIS retains the existing Orø marker position rather than assigning a moving ferry a fake live coordinate
  • Øresundsbron publishes two current pylon-camera views (west/east) on its official traffic-information page; small marker offsets are display-only and do not claim exact camera-mount GPS
  • Hundested Havn currently marks its webcam as defective; Vesterø's current official webcam destination exposes weather data only; Frederikshavn Havn has shut its public webcam down

Notes

  • small display offsets are used for co-located cameras so each marker remains clickable
  • official operator pages are preferred over generic webcam directories when a stable direct media endpoint is unavailable
  • no private/unlisted endpoints, authentication bypasses or camera controls are used
  • Sæby is intentionally unchanged for now: the current official harbour site exposes no webcam, but there is not enough evidence to classify the existing public listing as dead
  • Karrebæksminde is intentionally unchanged for now: current public references still point to Næstved Havns old bridge-camera URL, but the current official site structure did not yield a sufficiently clear verified endpoint
  • Roskilde Havn was checked; its current official site does not expose a public webcam page, so the generic Roskilde marker is left unchanged for now
  • Assens Marina and Egå Marina were checked; their current official sites did not expose a verified public webcam replacement
  • Henne Golfklub and Aalborg Østre Tennisklub were checked; their current official sites did not expose a verified webcam replacement, so those generic entries are left unchanged for now
  • Vejle Lystbådehavn is still held back pending reliable retrieval of its MJPEG feeds
  • Horsens/Rårup is still held back because the current webcam setup appears legacy/plugin-dependent
  • Port of Skagen expansion webcam is still held back until its map position is independently verified

@carbon-evolution
carbon-evolution merged commit 18abf9f into carbon-evolution:main Oct 18, 2026
7 checks passed
@carbon-evolution

Copy link
Copy Markdown
Owner

Thanks — merged, and the per-source verification notes made this easy to review. I checked that denmark-base.ts is the previous list moved unchanged, the batch files are pure data, all 49 new entries have unique ids inside Denmark and use HTTPS, and every replaced id exists in the base list. Tested on top of current main: 134 cameras, and the three PFG cameras return live JPEGs through the new fixed-upstream route.

Two small notes:

  • The camera lookup in denmark-official/route.ts matched inherited keys (?cam=constructor → 504). I switched it to Object.hasOwn in fix: trust Vercel geo headers only on Vercel; own-key camera lookup #42 so those return 400.
  • One entry uses https://bornholm-cajo.dev.tv2reg.digital — a dev. subdomain, which may be TV 2's development environment rather than a stable public page. If you know of a production URL for that Rønne camera, a future batch could swap it in.

carbon-evolution added a commit that referenced this pull request Oct 18, 2026
)

Follow-ups from reviewing #38 and #39:
- geo: x-vercel-ip-latitude/longitude/city are only meaningful when
  Vercel's edge sets them. Off Vercel (self-hosted, Docker) they are
  ordinary client headers, so require VERCEL=1 before using them;
  otherwise fall through to the HTTPS IP lookups.
- cctv/denmark-official: look up the camera with Object.hasOwn, so
  ?cam=constructor|toString|__proto__ is a 400 like any unknown camera
  (was a 504 after trying to fetch a non-URL).

Tests added to route-hardening.test.ts; 4 fail against the previous code.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@carbon-evolution

Copy link
Copy Markdown
Owner

@morein1 heads-up for future PRs: main now requires signed commits, so a PR with unsigned commits will show as blocked even when all checks pass. Before your next PR, please enable commit signing, e.g. with SSH:

git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
git config --global commit.gpgsign true

then add that public key on GitHub under Settings → SSH and GPG keys → New SSH key → Key type: Signing key. GitHub's guide: https://docs.github.com/authentication/managing-commit-signature-verification

Thanks again for the Denmark and geo contributions!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants