diff --git a/src/main/resources/web/assets/app.js b/src/main/resources/web/assets/app.js index a1338a9..d7e7aa5 100644 --- a/src/main/resources/web/assets/app.js +++ b/src/main/resources/web/assets/app.js @@ -900,11 +900,34 @@ function renderFavorites() { const search = el.favoritesSearch.value.trim().toLowerCase(); + const matchesText = (value) => String(value || "").toLowerCase().includes(search); const filtered = state.favorites.filter((item) => { const title = String(item?.title || "").toLowerCase(); const type = String(item?.mode || "").toLowerCase(); const url = String(item?.url || "").toLowerCase(); - return !search || title.includes(search) || type.includes(search) || url.includes(search); + if (!search || title.includes(search) || type.includes(search) || url.includes(search)) { + return true; + } + const mode = String(item?.mode || ""); + if (mode === "live_category") { + const categoryId = String(item?.id || ""); + const entry = state.favoriteLiveCategoryStreamsById[categoryId]; + const streams = Array.isArray(entry?.episodes) ? entry.episodes : []; + return streams.some((stream) => matchesText(stream?.name) || matchesText(stream?.stream_id)); + } + if (mode === "vod_category") { + const categoryId = String(item?.id || ""); + const entry = state.favoriteVodCategoryStreamsById[categoryId]; + const streams = Array.isArray(entry?.episodes) ? entry.episodes : []; + return streams.some((stream) => matchesText(stream?.name) || matchesText(stream?.stream_id)); + } + if (mode === "series_category") { + const categoryId = String(item?.id || ""); + const entry = state.favoriteSeriesCategoryItemsById[categoryId]; + const seriesItems = Array.isArray(entry?.episodes) ? entry.episodes : []; + return seriesItems.some((seriesItem) => matchesText(seriesItem?.name) || matchesText(seriesItem?.series_id)); + } + return false; }); if (filtered.length === 0) { @@ -1067,7 +1090,15 @@ wrap.className = "series-inline-episodes-wrap"; if (isLiveCategory) { const liveStreams = Array.isArray(episodesEntry.episodes) ? episodesEntry.episodes : []; - liveStreams.forEach((stream) => { + const visibleLiveStreams = search + ? liveStreams.filter((stream) => matchesText(stream?.name) || matchesText(stream?.stream_id)) + : liveStreams; + if (visibleLiveStreams.length === 0) { + episodesLi.innerHTML = `