Fixes#319 — Server appears as "undefined" on Samsung TV after network interruptions
when using mDNS (.local) hostnames.
Root cause:
The injected jellyfin_credentials in localStorage were missing the `Name` property.
When the TV couldn't reach the server (mDNS resolution failure), Jellyfin Web had
no cached server name to display, resulting in literal "undefined".
Changes:
- Add `Name` property to injected auto-login credentials using the real ServerName
from /System/Info/Public, with fallback to the server URL
- Store JellyfinServerName in AppSettings (fetched during server validation and
authentication, cleared on logout)
- Add the server's LocalAddress (IP-based) as a fallback entry in config.json so
the TV can still connect when mDNS resolution fails
- Add a visible warning banner in the UI when a .local hostname is detected,
advising users to use a direct IP address instead
- Add lblMdnsWarning localization key to all 28 language files (translated for
da, nl, en, fr, de, pt, tr — English fallback for remaining languages)
# Pull Request Template
## Branch
- [x] I branched off beta (not master) to develop this feature/fix
## Description
NixOS Shell added by @Confused-Engineer #321
Merged capability calls to prevent unexpected connection error #318
CustomWGT Path cleared after installation #320
---
## Type of Change
- [x] Bug fix (non-breaking change)
- [x] New feature (non-breaking change)
- [x] Documentation update
---
## Checklist
- [x] My code follows the existing project structure and style
- [x] I have tested my changes manually
- [x] I have added necessary documentation (if applicable)
- [x] I have verified that the installer still works with the underlying
CLI
# Pull Request Template
## Branch
- [x] I branched off beta (not master) to develop this feature/fix
## Description
Please include a summary of the change and which issue is fixed. Also
include relevant motivation and context.
Fixes # (issue number, if applicable)
---
## Type of Change
- [ ] Bug fix (non-breaking change)
- [ ] New feature (non-breaking change)
- [ ] Breaking change (fix or feature that would cause existing
functionality to change)
- [ ] Documentation update
- [ ] Other (please describe):
---
## Checklist
- [ ] My code follows the existing project structure and style
- [x] I have tested my changes manually
- [ ] I have added necessary documentation (if applicable)
- [x] I have verified that the installer still works with the underlying
CLI
---
## Additional Notes
Any other information that reviewers should know, including limitations,
concerns, or context about the change.
# Pull Request Template
## Branch
- [x] I branched off beta (not master) to develop this feature/fix
## Description
- Added feature by @balcsida, GitHub Token support to prevent rate
limits by using your own GitHub token
- YouTube trailers language fallback by @kingchenc, allowing you to
watch trailers in the selected Jellyfin language
- Network Interface is now saved
- Improved network subnet check
---
## Type of Change
- [x] Bug fix (non-breaking change)
- [x] New feature (non-breaking change)
- [x] Breaking change (fix or feature that would cause existing
functionality to change)
- [x] Documentation update
---
## Checklist
- [x] My code follows the existing project structure and style
- [x] I have tested my changes manually
- [x] I have added necessary documentation (if applicable)
- [x] I have verified that the installer still works with the underlying
CLI
Pinned Tmds.DBus.Protocol at 0.21.3.
[](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)
Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.
[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)
---
<details>
<summary>Dependabot commands and options</summary>
<br />
You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/Jellyfin2Samsung/Samsung-Jellyfin-Installer/network/alerts).
</details>
Fixes a long-standing Jellyfin upstream bug (jellyfin/jellyfin#12817)
where movies configured with non-English metadata languages (German,
Spanish, French, etc.) show no trailer button because TMDB returns empty
video data for non-English language queries.
## Problem
When Jellyfin fetches metadata with e.g. language=de, TMDB returns 0
trailers even though English trailers exist in their database. Jellyfin
makes no fallback to English. The issue was closed upstream as "not
planned" — unfixed for 2-3 years, affecting every non-English Jellyfin
user.
## Solution
Client-side trailer fallback system built into the existing YouTube fix
(V16 -> V17). No Jellyfin server changes required.
When a movie detail page has no trailer button:
1. TMDB: search for trailer in user's language (via
include_video_language parameter)
2. DuckDuckGo Lite: search "{title} Trailer {language}
site:youtube.com", match by title
3. TMDB: English trailer (cached from step 1, no extra API call)
4. DuckDuckGo Lite: English fallback (cached from step 2, no extra API
call)
Max 2 external HTTP requests (1x TMDB + 1x DDG). Steps 3+4 use cached
results.
## Why DuckDuckGo Lite instead of Google/YouTube search
Google and YouTube aggressively block automated requests with CAPTCHAs,
rate limiting, and bot detection. DuckDuckGo Lite (lite.duckduckgo.com)
returns plain HTML with no JavaScript, no API key required, no CAPTCHAs,
and no bot blocking. DDG Lite has been stable for years with minimal
changes to its HTML structure, making it a reliable fallback for trailer
discovery.
## Technical details
- Language detected from Jellyfin user settings
(document.documentElement.lang), not TV system language
- TMDB API key extracted at runtime from Jellyfin server plugin
configuration (GET /Plugins -> GET /Plugins/{id}/Configuration), falls
back to Jellyfin's default key from TmdbUtils.cs
- DDG results parsed with title extraction: language-matched results
prioritized, non-matched results cached as English fallback
- Trailer button injected as native Jellyfin UI element (same CSS
classes, Material Icons)
- Fullscreen overlay player reuses existing player.html bridge
- Closable via Tizen back button, Escape, Backspace, or video end
- httpsGet helper with 8s timeout and double-callback guard
- 22 non-English languages supported in DDG language map
## Fallback flow
```
Movie detail page loaded
|
+-- Trailer button exists? -> Yes -> normal existing fix (CustomPlayer)
|
+-- No -> Service: /trailer?tmdbId=X&lang={Jellyfin language}&tmdbKey={runtime key}
|
+-- 1. TMDB: trailer in user's language?
| -> Found -> play with CustomPlayer
|
+-- 2. DDG Lite: "{title} Trailer {language} site:youtube.com"
| -> Language matched in title? -> play with CustomPlayer
|
+-- 3. TMDB: English trailer (cached from step 1, no extra call)
| -> Found -> play with CustomPlayer
|
+-- 4. DDG Lite: English fallback (cached from step 2, no extra call)
| -> Found -> play with CustomPlayer
|
+-- Nothing found -> no trailer available
```
# Pull Request Template
## Branch
- [x] I branched off beta (not master) to develop this feature/fix
## Description
Please include a summary of the change and which issue is fixed. Also
include relevant motivation and context.
Fixes # (issue number, if applicable)
---
## Type of Change
- [x] Bug fix (non-breaking change)
- [x] New feature (non-breaking change)
- [x] Breaking change (fix or feature that would cause existing
functionality to change)
- [-] Documentation update
- [-] Other (please describe):
---
## Checklist
- [x] My code follows the existing project structure and style
- [-] I have tested my changes manually
- [-] I have added necessary documentation (if applicable)
- [-] I have verified that the installer still works with the underlying
CLI