diff --git a/README.md b/README.md
index 21d4976..6fdb93d 100644
--- a/README.md
+++ b/README.md
@@ -157,14 +157,15 @@ If you're running NodeCast TV behind a reverse proxy (Nginx, Caddy, Traefik) wit
| Symptom | Likely Cause | Solution |
|---------|--------------|----------|
| Streams fail with `fragLoadError` | Mixed content (HTTPS page loading HTTP streams) | Enable **"Force Backend Proxy"** in Settings → Streaming |
-| Channel icons don't load | Mixed content on images | Icons are loaded directly; no fix yet for HTTP icons on HTTPS |
-| Streams work on HTTP but not HTTPS | Reverse proxy not passing streams correctly | Ensure your proxy config supports streaming (disable buffering) |
+| Channel icons don't load | Mixed content on images | Icons are now automatically proxied on HTTPS - update to latest version |
+| Streams work on HTTP but not HTTPS | Reverse proxy not passing headers correctly | Ensure `X-Forwarded-Proto` header is set (see examples below) |
**Caddy example:**
```
tv.domain.com {
reverse_proxy nodecast:3000 {
flush_interval -1
+ header_up X-Forwarded-Proto {scheme}
}
}
```
@@ -176,10 +177,11 @@ location / {
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
}
```
-
### TVHeadend
If you're using TVHeadend as your source, you may need to configure a few settings for streams to play correctly in NodeCast TV:
diff --git a/public/js/components/ChannelList.js b/public/js/components/ChannelList.js
index 41b3289..6cdac0e 100644
--- a/public/js/components/ChannelList.js
+++ b/public/js/components/ChannelList.js
@@ -27,6 +27,19 @@ class ChannelList {
this.init();
}
+ /**
+ * Get proxied image URL to avoid mixed content errors on HTTPS
+ * Only proxies HTTP URLs when on HTTPS page
+ */
+ getProxiedImageUrl(url) {
+ if (!url || url.length === 0) return '/img/placeholder.png';
+ // Only proxy if we're on HTTPS and the image is HTTP
+ if (window.location.protocol === 'https:' && url.startsWith('http://')) {
+ return `/api/proxy/image?url=${encodeURIComponent(url)}`;
+ }
+ return url;
+ }
+
/**
* Load collapsed state from localStorage
*/
@@ -399,7 +412,7 @@ class ChannelList {
data-stream-id="${channel.streamId || ''}"
data-url="${channel.url || ''}"
data-render-id="${renderId}">
-