← back to Prestige Car Wash
Render REAL business photos + videos (do NOT overwrite the curated prod places.json): format-agnostic photo_urls + video passthrough on home & admin Google tab; adopt curated places.json + track real media in git
4e71985e739bc1f5f6de179ca2b93621792b6337 · 2026-07-05 17:08:14 -0700 · Steve
Files touched
M .gitignoreM data/places.jsonA media/real/real-brabus-g900.jpgA media/real/real-corvette.jpgA media/real/real-lot-tour-poster.jpgA media/real/real-lot-tour.mp4A media/real/real-mustang-foam.jpgA media/real/real-price-board.jpgA media/real/real-storefront.jpgA media/real/real-tunnel-benz.jpgA media/real/real-type-r.jpgA media/real/real-unlimited-member-poster.jpgA media/real/real-unlimited-member.mp4A media/real/real-wheel-detail-poster.jpgA media/real/real-wheel-detail.mp4M public/admin/index.htmlM public/index.htmlM server.js
Diff
commit 4e71985e739bc1f5f6de179ca2b93621792b6337
Author: Steve <steve@designerwallcoverings.com>
Date: Sun Jul 5 17:08:14 2026 -0700
Render REAL business photos + videos (do NOT overwrite the curated prod places.json): format-agnostic photo_urls + video passthrough on home & admin Google tab; adopt curated places.json + track real media in git
---
.gitignore | 3 +
data/places.json | 126 ++++++++++++++++++++--------
media/real/real-brabus-g900.jpg | Bin 0 -> 168686 bytes
media/real/real-corvette.jpg | Bin 0 -> 130548 bytes
media/real/real-lot-tour-poster.jpg | Bin 0 -> 81247 bytes
media/real/real-lot-tour.mp4 | Bin 0 -> 10239804 bytes
media/real/real-mustang-foam.jpg | Bin 0 -> 246937 bytes
media/real/real-price-board.jpg | Bin 0 -> 120361 bytes
media/real/real-storefront.jpg | Bin 0 -> 268309 bytes
media/real/real-tunnel-benz.jpg | Bin 0 -> 262780 bytes
media/real/real-type-r.jpg | Bin 0 -> 266357 bytes
media/real/real-unlimited-member-poster.jpg | Bin 0 -> 90789 bytes
media/real/real-unlimited-member.mp4 | Bin 0 -> 10532113 bytes
media/real/real-wheel-detail-poster.jpg | Bin 0 -> 92902 bytes
media/real/real-wheel-detail.mp4 | Bin 0 -> 10072137 bytes
public/admin/index.html | 6 +-
public/index.html | 13 ++-
server.js | 14 +++-
18 files changed, 121 insertions(+), 41 deletions(-)
diff --git a/.gitignore b/.gitignore
index 6069e71..9a60c34 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,3 +26,6 @@ media/.cache/
# runtime lead capture (PII) — never commit
reports/leads.jsonl
+
+# real business photography — DO track (irreplaceable, not regenerable)
+!media/real/
diff --git a/data/places.json b/data/places.json
index 7043f5b..5117e3c 100644
--- a/data/places.json
+++ b/data/places.json
@@ -1,56 +1,114 @@
{
"_mock": false,
+ "_note": "Populated from public listings 2026-07-04: Yelp biz page (prestige-hand-car-wash-los-angeles), owner Instagram @prestigecwash, and a receipt photo confirming address+phone. Rating/review-count intentionally null until the Google Places API key is added (gated) — never display numbers we can't verify.",
"name": "Prestige Car Wash",
- "address": "7601 Reseda Blvd, Reseda, CA 91335, USA",
- "phone": "(747) 265-6293",
- "rating": 4.3,
- "reviews_count": 47,
+ "legal_name": "Prestige Hand Car Wash",
+ "address": "7601 Reseda Blvd, Reseda, CA 91335",
+ "cross_street": "Reseda Blvd & Saticoy St",
+ "phone": "(818) 631-1545",
+ "rating": 4.4,
+ "reviews_count": 34,
"hours": [
- "Monday: 8:00 AM – 6:00 PM",
- "Tuesday: 8:00 AM – 6:00 PM",
- "Wednesday: 8:00 AM – 6:00 PM",
- "Thursday: 8:00 AM – 6:00 PM",
- "Friday: 8:00 AM – 6:00 PM",
- "Saturday: 8:00 AM – 6:00 PM",
- "Sunday: 8:00 AM – 5:00 PM"
+ "Mon–Sat 8:00 AM – 6:00 PM",
+ "Sun 8:00 AM – 5:00 PM"
+ ],
+ "website": "https://prestigehandcarwash.com",
+ "yelp_url": "https://www.yelp.com/biz/prestige-hand-car-wash-los-angeles",
+ "instagram": "https://www.instagram.com/prestigecwash/",
+ "maps_query": "https://www.google.com/maps/search/Prestige+Hand+Car+Wash+7601+Reseda+Blvd+Reseda+CA+91335",
+ "place_id": "",
+ "photos": [
+ "media/real/real-mustang-foam.jpg",
+ "media/real/real-tunnel-benz.jpg",
+ "media/real/real-type-r.jpg",
+ "media/real/real-brabus-g900.jpg",
+ "media/real/real-corvette.jpg",
+ "media/real/real-price-board.jpg",
+ "media/real/real-storefront.jpg"
+ ],
+ "videos": [
+ {
+ "src": "media/real/real-lot-tour.mp4",
+ "poster": "media/real/real-lot-tour-poster.jpg",
+ "label": "Lot tour — fresh off the line"
+ },
+ {
+ "src": "media/real/real-wheel-detail.mp4",
+ "poster": "media/real/real-wheel-detail-poster.jpg",
+ "label": "Hand wheel detail at Reseda & Saticoy"
+ },
+ {
+ "src": "media/real/real-unlimited-member.mp4",
+ "poster": "media/real/real-unlimited-member-poster.jpg",
+ "label": "An unlimited-wash member's visit"
+ }
],
- "website": "https://www.instagram.com/prestigecwash/",
- "maps_url": "https://maps.google.com/?cid=6346427394384689915&g_mp=CiVnb29nbGUubWFwcy5wbGFjZXMudjEuUGxhY2VzLkdldFBsYWNlEAIYBCAA",
- "place_id": "ChIJ5Wj7RtKbwoAR-3obIxcKE1g",
"reviews": [
{
- "author": "Don Thorn",
+ "source": "Yelp",
+ "author": "Janey E.",
+ "rating": 5,
+ "date": "2026-04",
+ "text": "I almost don’t even want to give this place five stars or even write a review because it genuinely feels like something I want to gatekeep — but they deserve all the business they can get."
+ },
+ {
+ "source": "Yelp",
+ "author": "June Q.",
"rating": 5,
- "text": "I will be coming here from now on. This is a old fashioned hand car wash. The staff are very customer focused. I have been looking for a Hand Car Wash for awhile and this place checks all the boxes ."
+ "date": "2026-06",
+ "text": "Great service… My car is so clean. Thank you! I highly recommend. The space is also very spacious, and there’s plenty of seating!"
},
{
- "author": "Sam Bae",
+ "source": "Yelp",
+ "author": "Tony B.",
"rating": 5,
- "text": "We are so glad Prestige Car Wash in Reseda is finally open again! This location had been shut down for many years, and we used to come here all the time, so we were thrilled to see the new owner reopen it.\n\nWe brought our 2016 Tesla Model Y in for a hand wash on Sunday afternoon, and the experience was amazing.\nWe forgot the new owner's name, but he is incredibly generous and genuinely cares about his customers.\n\nOur carwash guy, Albert, did an absolute phenomenal job—he cleaned our car thoroughly and left it looking very impressive. They also offer a \"buy 10 washes, get 1 free\" program, which is a fantastic bonus. This is officially going to be our go-to car wash from now on.\nThank you!"
+ "date": "2025-09",
+ "text": "Best car wash around! Super professional, fast, and my car came out spotless. The hand wash makes a huge difference. The attention to detail is next level. Highly recommend."
},
{
- "author": "Catlan Rich",
+ "source": "Yelp",
+ "author": "Alan G.",
"rating": 5,
- "text": "The best car wash in the west valley. Their attention to detail is fantastic and my car looks better than when I do it. Their staff and workers are always very friendly and the price is just as nice."
+ "date": "2025-12",
+ "text": "Very great pricing for very great washes. Nelson was very friendly. He took great care of my Corvette inside and out and gave attention to all the little details. My car came out spotless."
},
{
- "author": "Martin M",
- "rating": 1,
- "text": "The manager or owner is disrespectful and is in need of a major attitude readjustment. The chemicals they used during the hand wash left a film on my car that they refused to fix and handed me my keys telling me to leave. I observed 2 others complaining while I was waiting for my car to be washed. It’s sad that car washes of this type are disappearing but with that management I could see why. Customers BEWARE."
+ "source": "Yelp",
+ "author": "CustomDip W.",
+ "rating": 5,
+ "date": "2026-01",
+ "text": "I’ll start off by saying wow!!! This car wash staff is amazing, very professional, kind, and caring in all aspects. This is my 8th time bringing my car here."
+ },
+ {
+ "source": "Yelp",
+ "author": "Paige M.",
+ "rating": 5,
+ "date": "2026-06",
+ "text": "If you’re in Reseda, definitely come here for a car wash. I was so happy to see that they were able to reopen! The staff are incredibly kind, attentive, and friendly."
+ },
+ {
+ "source": "Yelp",
+ "author": "Arias A.",
+ "rating": 5,
+ "date": "2026-01",
+ "text": "The convenience of drive-up full-service car washes seems to be going the way of the dinosaurs. Most classic spots have been reworked by the self-serve monthly membership brands. Prestige is different."
+ },
+ {
+ "source": "Yelp",
+ "author": "Jordana K.",
+ "rating": 5,
+ "date": "2026-06",
+ "text": "I had just come off a long road trip and my car was a mess with the dirt and the bugs. I didn’t have a lot of time. They suggested an express wash and took care making sure it was all handled."
},
{
- "author": "Christian Rogers",
+ "source": "Yelp",
+ "author": "Magin B.",
"rating": 5,
- "text": "Very good value for your money. Your car will be much cleaner spending 28$ with these guys every 3 weeks than to pay 12$ a week at one of those automatic car washes that scratch your paint. Comes with vacuum, tire shine, and hand drying for that price."
+ "date": "2026-05",
+ "text": "I’m updating my review because our second experience completely changed my opinion."
}
],
- "photos": [
- "places/ChIJ5Wj7RtKbwoAR-3obIxcKE1g/photos/AaVGc3kGFKbtjjQ95YnUby4FPJeuLGv7dbqGfz1TMDJn69x7_1qkJ-CMADUNJFZ_rrj5Db2RSovGbB5CPsBptxukBsZbtPiP28fWXmz5ybxFW6X0iq1MorQ0BjWvy9KEqNWV9YEAqJnAmq-Ik1GkySw_l28fPTDaio-G-8ZUSA6762HX29zx4MYgquTVMu234nYmKT9JBaFD9sAM2ad0DP4C1KPsuMMfhR_CaPp94ZevropGU8XCp6QerKlkhKC7RmDG8GoD0mSci7a0iNwEWb9RxpU8W6nx_1jp-IjqGny7h18yyN2ZLvW3d8ZGYdX1dsdZmVV0JwbTxuO3LwkpLNBupwme4eW231pj_JV3c1-a_qmeIq3CdCnxI8iosUuK763894fGUpOEqPZT06n9rtMpJgefgXPK4wSgINa4ZruDb6cGrBa3XhPWeSpcGleVBw",
- "places/ChIJ5Wj7RtKbwoAR-3obIxcKE1g/photos/AaVGc3mvud3dh7SBNaK1XGwF8mJFoWQndFtANrdCA99V8bVz2dCTpt6euR-PE2TBr_l49kanufmR48dhxkyxuqIhwetKgUzR5cTmhkzkYLLlcf1k8FrwOTjvvuevZfdp7NdtHezdabsG4AFynFvQkhkgfzr-pUfV3KFxxevWx5Xu9-cdv7B7vkNEnagRAwGANmJbTMDOZtl2_GTG0E6jaTKvbpk2CFECVxefTGHVVJo2KZsaT3e5YoGI9Opsg553CnVwqjnVlvd3MEOz_udcWeKIEod4x2FVMo4B_5J9IpbIFdGZ86Ac2OfS_jqNsbTDlkB6gziFB2hlaVNXSrZ9wJ5NMnoMsKO6Ir3sU4Y74quiiQxwhawn5SLYhERwsxuwzZ508B_o6rwzrmdbUrmZpMghwsJUmRKdpzotMsvzVzf75fBe5z50tamhG8Cc4-msbg",
- "places/ChIJ5Wj7RtKbwoAR-3obIxcKE1g/photos/AaVGc3lDAT4VhLjgb4dC0PaMGSvM3ZrD5DofkzzdNqWX_nXtrMIxPVGbd1VzVs0ZhlofG702JJjOp8wOGqisvoTCXhEr6cino3ZaKJ-lf4r683YnfeEHca65DkfThRRswCrQItw8mLDPruq1wJpmax_9GP-d9M4l0ERPMpvRZ7sOT_CyCPgkkjlR73PnbzHLojGU_ngjhCDf3RwsEDCEpAbqLdXg0PUf1GbXAnzfkqhboCZ9D5BFLoXBj1ECSg4-LMDNXVKHzCevdHWWVwRShbN62YoEWuMJsR5hsuzKCu4yioBAHOMA1e-XlZk17WqEWy4Ibm9C13bKtwtY4-E5vCT1Z9Lq1jEzJlwPPOdNHKtNfuah2ruw9avZxqPlVqnQI-Mlv8zg8Xur4f7k7qMtLxydkLjmztJ7TCxwDlSK56aQPHrtTUCzr8HIjgQppXrV_hwa",
- "places/ChIJ5Wj7RtKbwoAR-3obIxcKE1g/photos/AaVGc3mtQjRpchRSQLHDJATyTrnVwQtFK8t8AhSpFw69EYIjeBlKzbAa4RKYPlOeG7rt-fXAGMUNtGoOXe1eqSOfT6G5TxdOUieC-t9AlWPw1LHorkq_AYK8OTVVp2uEgX6ObMtJZ7XBkcgJZlQkGssJQ5c_mAMzehmwDoBk6k6lO1G5G6pjngyimwA90NLNZypJKFIXSwHcTX77PsN_yr6tV12rt0saplfGLh6dQQQsBvMlpBxnR4222LHsZuikx-4QPmxtSxL5p9UHjofBJsUx9--XHRIZiFx2BlwhNyUtvxfIG77XGAf9pyuhFc3LHZqGZJGvUpZoIgF1PIZDiwFEGxP0XfoZJsc4flnLzrlbm8J_C3l28agt9RoGZ82lPJa6MvI7Ns212YVNJM0sWlKzSLj7YfJ6tCkDg_I2iapr0XpVfJOpScLBDVH16JqNG5b0",
- "places/ChIJ5Wj7RtKbwoAR-3obIxcKE1g/photos/AaVGc3mt3lgbZ3YbUHaGPa_BLNxrL_by9hAaNlVT-l9wdhNKjZ4TIIzI4ceM_BR0BVK2YhDZioe2rkHtwBVtEyhUWXozJVJZoh8voicj_ALykb6eWihCGti0h_ZyqICTIFqzLAslvNTMq-E9G2SqLea45T3h3qcwR8HRgnJK6k6fAP4XrK-pXGV7ZztiScxycV_BhjhJPHMFEnzwyeju0jjaSWL2NVzZVCEKMrn1ny4qioyGmgaEfaPk_U2uroY-p_A7K1QpmnK3CgNXWeckl0c4C3iH-alN03kIsI1ixK3UgKkdLo1eqkL8nyq1vb6ooYitcseaisSMimFlnGz7L40hRFkMzuWwaSQkSFd57sQLAm1z9UzBx_V_sWY17o_cIxZ_FnlKNiIIvPKi8ForWVadwzOGxp17bojwy3QBoAt1GbLZdwiSCtK7Z5EtMO3fnfam",
- "places/ChIJ5Wj7RtKbwoAR-3obIxcKE1g/photos/AaVGc3lfxN6Daxy8ugF-TZqbe-tV-vqxVBKdOexKpl7k8GUjI9Uuzd2_mNpwv6BW1NTrn41Bz_Loitvr2o0FF9Jmv9xECKps4L88S5F1HqsgtORo7aYXCb5hc1gHlIflY8QnZeastUGdiXLoJ1AWz1ugcTpRp0bXGbs17kn1Nw1Ms5AroPZISKCH_ZMXlALUhCeHHA2kl-MqJaMnuP6Z7IfmShgR5Zh3S5ixnl_PEfvxMv3tYelJx0ksosfRCeUqklWNusAQJuoopMnG9XGM0sqsaqgyGEoGz7Nd8HRqkkOxTztDmpr0a57zRt58n1Y4rdBelvg2nriSXkWsC8PYTqAsWMoy9ZEOhGX5h159Pz1qYNvu-czV7QAHK6OME73KYW_J4EK84ZaC2UvTO3_yeDdWLdUhoADBrzaNvmZvO_6efwvHGCnrewr7AKuSgHRVPelq"
- ],
- "updated_at": "2026-07-05T11:55:06.030Z"
+ "updated_at": "2026-07-05T09:45:00-07:00",
+ "rating_source": "Yelp",
+ "rating_note": "Yelp page shows 4.4/34 (2026-03); Apple Maps Yelp widget 4.1/45; MapQuest Yelp feed 4.5/24. Google rating unverified (no Places key yet)."
}
\ No newline at end of file
diff --git a/media/real/real-brabus-g900.jpg b/media/real/real-brabus-g900.jpg
new file mode 100644
index 0000000..cb828f1
Binary files /dev/null and b/media/real/real-brabus-g900.jpg differ
diff --git a/media/real/real-corvette.jpg b/media/real/real-corvette.jpg
new file mode 100644
index 0000000..355418d
Binary files /dev/null and b/media/real/real-corvette.jpg differ
diff --git a/media/real/real-lot-tour-poster.jpg b/media/real/real-lot-tour-poster.jpg
new file mode 100644
index 0000000..d4c93d8
Binary files /dev/null and b/media/real/real-lot-tour-poster.jpg differ
diff --git a/media/real/real-lot-tour.mp4 b/media/real/real-lot-tour.mp4
new file mode 100644
index 0000000..5aaa68d
Binary files /dev/null and b/media/real/real-lot-tour.mp4 differ
diff --git a/media/real/real-mustang-foam.jpg b/media/real/real-mustang-foam.jpg
new file mode 100644
index 0000000..da2c1ac
Binary files /dev/null and b/media/real/real-mustang-foam.jpg differ
diff --git a/media/real/real-price-board.jpg b/media/real/real-price-board.jpg
new file mode 100644
index 0000000..30f0e76
Binary files /dev/null and b/media/real/real-price-board.jpg differ
diff --git a/media/real/real-storefront.jpg b/media/real/real-storefront.jpg
new file mode 100644
index 0000000..e42c91b
Binary files /dev/null and b/media/real/real-storefront.jpg differ
diff --git a/media/real/real-tunnel-benz.jpg b/media/real/real-tunnel-benz.jpg
new file mode 100644
index 0000000..94f783c
Binary files /dev/null and b/media/real/real-tunnel-benz.jpg differ
diff --git a/media/real/real-type-r.jpg b/media/real/real-type-r.jpg
new file mode 100644
index 0000000..3f0752d
Binary files /dev/null and b/media/real/real-type-r.jpg differ
diff --git a/media/real/real-unlimited-member-poster.jpg b/media/real/real-unlimited-member-poster.jpg
new file mode 100644
index 0000000..1a69f93
Binary files /dev/null and b/media/real/real-unlimited-member-poster.jpg differ
diff --git a/media/real/real-unlimited-member.mp4 b/media/real/real-unlimited-member.mp4
new file mode 100644
index 0000000..908c744
Binary files /dev/null and b/media/real/real-unlimited-member.mp4 differ
diff --git a/media/real/real-wheel-detail-poster.jpg b/media/real/real-wheel-detail-poster.jpg
new file mode 100644
index 0000000..887eaee
Binary files /dev/null and b/media/real/real-wheel-detail-poster.jpg differ
diff --git a/media/real/real-wheel-detail.mp4 b/media/real/real-wheel-detail.mp4
new file mode 100644
index 0000000..e1bfa8e
Binary files /dev/null and b/media/real/real-wheel-detail.mp4 differ
diff --git a/public/admin/index.html b/public/admin/index.html
index a5aeb48..3b05284 100644
--- a/public/admin/index.html
+++ b/public/admin/index.html
@@ -188,8 +188,10 @@ function renderGoogle(){
<div class="blurb">${enc(p.address)} ${p.rating?'· '+rating(p.rating)+' ('+(p.reviews_count||0)+')':''}</div>
<div class="ttl" style="font-size:14px;margin-top:10px">Hours</div>
${(p.hours||[]).map(h=>`<div class="kv"><span>${enc(h)}</span></div>`).join('')}
- ${(p.photos&&p.photos.length)?`<div class="ttl" style="font-size:14px;margin-top:14px">Photos (${p.photos.length})</div>
- <div class="grid" style="--cols:3;gap:8px;margin-top:8px">${p.photos.map((_,i)=>`<img src="/api/places/photo/${i}?w=500" loading="lazy" style="width:100%;aspect-ratio:4/3;object-fit:cover;border-radius:10px;border:1px solid var(--line)">`).join('')}</div>`:''}
+ ${(p.videos&&p.videos.length)?`<div class="ttl" style="font-size:14px;margin-top:14px">Videos (${p.videos.length})</div>
+ <div class="grid" style="--cols:3;gap:8px;margin-top:8px">${p.videos.map(v=>`<video src="${v.src}" ${v.poster?`poster="${v.poster}"`:''} muted loop autoplay playsinline title="${enc(v.label||'')}" style="width:100%;aspect-ratio:16/9;object-fit:cover;border-radius:10px;border:1px solid var(--line)"></video>`).join('')}</div>`:''}
+ ${(p.photo_urls&&p.photo_urls.length)?`<div class="ttl" style="font-size:14px;margin-top:14px">Photos (${p.photo_urls.length})</div>
+ <div class="grid" style="--cols:3;gap:8px;margin-top:8px">${p.photo_urls.map(u=>`<img src="${u}${u.startsWith('/api/')?'?w=500':''}" loading="lazy" style="width:100%;aspect-ratio:4/3;object-fit:cover;border-radius:10px;border:1px solid var(--line)">`).join('')}</div>`:''}
${(p.reviews&&p.reviews.length)?`<div class="ttl" style="font-size:14px;margin-top:14px">Recent reviews</div>
${p.reviews.slice(0,4).map(r=>`<div class="kv" style="flex-direction:column;align-items:flex-start;gap:2px"><span class="rate">★ ${r.rating} — ${enc(r.author)}</span><span style="color:var(--mut);font-size:12px">${enc((r.text||'').slice(0,180))}${(r.text||'').length>180?'…':''}</span></div>`).join('')}`:''}
<div style="margin-top:14px;display:flex;gap:8px;flex-wrap:wrap">
diff --git a/public/index.html b/public/index.html
index eb0e421..2ac8604 100644
--- a/public/index.html
+++ b/public/index.html
@@ -75,6 +75,7 @@
<a class="btn" href="/contact" style="margin-top:8px">Book a wash</a>
</div></div>
</div>
+ <div class="grid" id="locVideos" style="--cols:3;margin-top:16px"></div>
<div class="grid" id="locPhotos" style="--cols:6;margin-top:16px"></div>
</div></section>
@@ -115,10 +116,14 @@ fetch('/api/places').then(r=>r.json()).then(p=>{
document.getElementById('locAddr').textContent=(p.address||'San Fernando Valley, CA')+(p.phone?' · '+p.phone:'');
document.getElementById('locHours').innerHTML=(p.hours||[]).map(h=>
`<div style="padding:5px 0;border-top:1px solid var(--line);font-size:13px;color:var(--mut)">${h}</div>`).join('');
- // Real Google photos via the server-side proxy (key stays server-side).
- const n=(p.photos||[]).length;
- if(n) document.getElementById('locPhotos').innerHTML=Array.from({length:n},(_, i)=>
- `<img src="/api/places/photo/${i}?w=400" loading="lazy" style="width:100%;aspect-ratio:1;object-fit:cover;border-radius:12px;border:1px solid var(--line)">`).join('');
+ // Real business photos (server emits ready-to-use URLs: local paths or proxied Google refs).
+ const urls=p.photo_urls||[];
+ if(urls.length) document.getElementById('locPhotos').innerHTML=urls.map(u=>
+ `<img src="${u}${u.startsWith('/api/')?'?w=400':''}" loading="lazy" style="width:100%;aspect-ratio:1;object-fit:cover;border-radius:12px;border:1px solid var(--line)">`).join('');
+ // Real business videos (lot tour, wheel detail, member visit).
+ const vids=p.videos||[];
+ if(vids.length) document.getElementById('locVideos').innerHTML=vids.map(v=>
+ `<div class="card"><div class="media" style="aspect-ratio:16/9"><video src="${v.src}" ${v.poster?`poster="${v.poster}"`:''} muted loop autoplay playsinline style="width:100%;height:100%;object-fit:cover"></video></div>${v.label?`<div class="body"><div class="blurb" style="margin:0">${v.label}</div></div>`:''}</div>`).join('');
});
</script>
</body>
diff --git a/server.js b/server.js
index 9f30717..863a446 100644
--- a/server.js
+++ b/server.js
@@ -132,7 +132,19 @@ app.get('/api/facets', (req, res) => {
});
app.get('/api/best-times', (req, res) => res.json(bestTimes()));
-app.get('/api/places', (req, res) => res.json(places()));
+// Emit ready-to-use photo/video URLs so the client is format-agnostic:
+// Google photo refs → the proxy route; local paths (real business photos) → direct.
+app.get('/api/places', (req, res) => {
+ const p = places();
+ const photo_urls = (p.photos || []).map((ph, i) =>
+ /^places\//.test(ph) ? `/api/places/photo/${i}` : '/' + String(ph).replace(/^\//, ''));
+ const videos = (p.videos || []).map(v => ({
+ ...v,
+ src: '/' + String(v.src || '').replace(/^\//, ''),
+ poster: v.poster ? '/' + String(v.poster).replace(/^\//, '') : ''
+ }));
+ res.json({ ...p, photo_urls, videos });
+});
// ---- admin bucket APIs -----------------------------------------------------
app.get('/api/admin/competitors', (req, res) => res.json(competitors()));
← c69cb23 Show real Google photos: server-side photo proxy (/api/place
·
back to Prestige Car Wash
·
auto-save: 2026-07-19T07:25:16 (1 files) — server.js 9002496 →