feat(ui): surface live language filters and built-in EPG sources (#23)

Add language filter controls for projected live channels, preserve backend language views in the browser, and separate built-in EPG sources from custom sources.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
blomios
2026-10-06 11:42:23 +02:00
parent 2a1c745a26
commit 638a31d9ef
9 changed files with 425 additions and 25 deletions

View File

@ -126,8 +126,8 @@
<div class="sidebar-header">
<div class="sidebar-header-row">
<div class="search-wrapper">
<input type="text" id="channel-search" placeholder="Search channels..." class="search-input">
<button type="button" class="search-clear" title="Clear search">&times;</button>
<input type="text" id="channel-search" placeholder="Search channels…" class="search-input">
<button type="button" class="search-clear" title="Clear search" aria-label="Clear channel search">&times;</button>
</div>
<button id="sidebar-collapse-btn" class="btn btn-sm btn-ghost sidebar-collapse-btn"
title="Collapse sidebar">
@ -148,6 +148,8 @@
</button>
</div>
<div class="language-filter" id="channel-language-filter" aria-label="Languages"></div>
<div id="channel-list-status" class="sr-only" role="status" aria-live="polite"></div>
</div>
<div id="channel-list" class="channel-list">
<div class="empty-state">
@ -421,7 +423,15 @@
<div class="source-section">
<div class="section-header">
<h3>EPG Sources</h3>
<h3>Built-in EPG sources</h3>
</div>
<p class="setting-hint">Built-in sources provide free EPG data. You can disable them, but they can’t be removed.</p>
<div id="builtin-epg-list" class="source-list"></div>
</div>
<div class="source-section">
<div class="section-header">
<h3>Custom EPG sources</h3>
<button class="btn btn-primary" id="add-epg">+ Add EPG</button>
</div>
<div id="epg-list" class="source-list"></div>
@ -1200,19 +1210,19 @@
<!-- JavaScript -->
<script src="/js/icons.js"></script>
<script src="/js/api.js?v=4"></script>
<script src="/js/api.js?v=5"></script>
<script src="/js/components/VideoPlayer.js?v=5"></script>
<script src="/js/services/channelLanguageDetection.js?v=1"></script>
<script src="/js/services/channelLanguageFusion.js?v=1"></script>
<script src="/js/services/layaStatusPresentation.js?v=5"></script>
<script src="/js/services/liveAnalysisPresentation.js?v=1"></script>
<script src="/js/services/liveChannelProjection.js?v=1"></script>
<script src="/js/services/liveChannelProjection.js?v=2"></script>
<script src="/js/services/channelVariantGrouping.js?v=7"></script>
<script src="/js/components/ChannelList.js?v=11"></script>
<script src="/js/components/SourceManager.js?v=2"></script>
<script src="/js/components/EpgGuide.js?v=2"></script>
<script src="/js/components/ChannelList.js?v=12"></script>
<script src="/js/components/SourceManager.js?v=3"></script>
<script src="/js/components/EpgGuide.js?v=3"></script>
<script src="/js/pages/HomePage.js?v=2"></script>
<script src="/js/pages/LivePage.js?v=2"></script>
<script src="/js/pages/LivePage.js?v=3"></script>
<script src="/js/pages/Guide.js?v=2"></script>
<script src="/js/pages/MoviesPage.js?v=4"></script>
<script src="/js/pages/SeriesPage.js?v=1"></script>