From 973370074414ad5ab8f2c401001793294822bf16 Mon Sep 17 00:00:00 2001 From: ivarlovlie Date: Mon, 5 Dec 2022 14:03:54 +0900 Subject: feat: WIP! radio series details --- src/Endpoints/GetRadioSeriesDetails.cs | 26 ++++++++++++++++++++++++++ src/Endpoints/GetRadioSeriesList.cs | 14 ++++++++++++-- src/RadioIndexDb.cs | 21 +++++++++++++++++++++ src/wwwroot/radio.js | 25 +++++++++++++++++++++---- 4 files changed, 80 insertions(+), 6 deletions(-) create mode 100644 src/Endpoints/GetRadioSeriesDetails.cs diff --git a/src/Endpoints/GetRadioSeriesDetails.cs b/src/Endpoints/GetRadioSeriesDetails.cs new file mode 100644 index 0000000..0bdbd6c --- /dev/null +++ b/src/Endpoints/GetRadioSeriesDetails.cs @@ -0,0 +1,26 @@ +using Microsoft.AspNetCore.Mvc; + +namespace I2R.LightNews.Endpoints; + +public class GetRadioSeriesDetails : EndpointBase +{ + private readonly NrkRadioService _radio; + + public GetRadioSeriesDetails(NrkRadioService radio) { + _radio = radio; + } + + public class Response + { + public List Seasons { get; set; } + public List Episodes { get; set; } + } + + [HttpGet("~/radio-series/{id:int}")] + public ActionResult GetRadioSeries(int id) { + var series = RadioIndexDb.GetSeriesById(id); + if (series == default) { + return NoContent(); + } + } +} \ No newline at end of file diff --git a/src/Endpoints/GetRadioSeriesList.cs b/src/Endpoints/GetRadioSeriesList.cs index 7898f25..1005a45 100644 --- a/src/Endpoints/GetRadioSeriesList.cs +++ b/src/Endpoints/GetRadioSeriesList.cs @@ -6,8 +6,18 @@ public class RadioSearchEndpoint : EndpointBase { public RadioSearchEndpoint() { } + public class Response + { + public int Id { get; set; } + public string Name { get; set; } + } + [HttpGet("~/radio-series")] - public async Task HandleAsync(string q) { - return Ok(RadioIndexDb.GetSeries(q)); + public async Task>> HandleAsync(string q) { + var series = RadioIndexDb.GetSeries(q); + return Ok(series.Select(c => new Response() { + Id = c.Id, + Name = c.Name + })); } } \ No newline at end of file diff --git a/src/RadioIndexDb.cs b/src/RadioIndexDb.cs index 6b629a7..3418891 100644 --- a/src/RadioIndexDb.cs +++ b/src/RadioIndexDb.cs @@ -58,6 +58,27 @@ select last_insert_rowid();", new { return db.QueryFirstOrDefault(@"select * from series where nrk_id=@nrkId", new {nrkId}); } + public static RadioSeries GetSeriesById(int id) { + using var db = new SqliteConnection(ConnectionString); + if (!db.TableExists("series")) return default; + return db.QueryFirstOrDefault(@"select * from series where id=@id", new {id}); + } + + public static SeriesDetails GetSeriesDetailsById(int id) { + using var db = new SqliteConnection(ConnectionString); + if (!db.TableExists("series")) return default; + return db.QueryFirstOrDefault(@" + select id as s_id, name as s_name from seasons where series_id=1; + select id as e_id, name as e_name, source_url as e_source from episodes where series_id=1; +", new {id}); + } + + public class SeriesDetails + { + public List Seasons { get; set; } + public List Episodes { get; set; } + } + public static RadioSeason GetSeasonByNrkId(string nrkId) { using var db = new SqliteConnection(ConnectionString); if (!db.TableExists("seasons")) return default; diff --git a/src/wwwroot/radio.js b/src/wwwroot/radio.js index 3edc99e..1176dfd 100644 --- a/src/wwwroot/radio.js +++ b/src/wwwroot/radio.js @@ -14,18 +14,31 @@ async function get_series() { function search(query) { if (!query) { - document.querySelectorAll("#series li").forEach(el => el.style.display = "list-item"); + document.querySelectorAll("#series li").forEach(el => { + el.style.display = "list-item"; + el.innerHTML = el.innerHTML + .replaceAll("", "") + .replaceAll("", ""); + }); return; } console.log("Searching for " + query); const results = fuzzysort.go(query, series, {key: "name"}); console.log("Found " + results.length + " results"); - const ids = results.map(x => x.obj.id); for (const seriesEl of document.querySelectorAll("#series li")) { - seriesEl.style.display = ids.includes(parseInt(seriesEl.dataset.id)) ? "list-item" : "none"; + const matchIndex = results.findIndex(p => p.obj.id === parseInt(seriesEl.dataset.id)); + const isMatch = matchIndex !== -1; + seriesEl.style.display = isMatch ? "list-item" : "none"; + if (isMatch) { + seriesEl.querySelector("summary").innerHTML = fuzzysort.highlight(results[matchIndex], "", ""); + } } } +function expand_series(listItem) { + console.log("Toggling " + listItem.dataset.id); +} + function build_frontpage(series) { const listEl = document.createElement("ul"); listEl.id = "series"; @@ -38,8 +51,12 @@ function build_frontpage(series) { const listItemDetailsEl = document.createElement("details"); const listItemDetailsSummaryEl = document.createElement("summary"); listItemEl.dataset.id = serie.id; - listItemDetailsSummaryEl.innerText = serie.name; + listItemDetailsSummaryEl.innerHTML = "" + serie.name + ""; listItemDetailsEl.appendChild(listItemDetailsSummaryEl); + listItemDetailsEl.ontoggle = (event) => { + expand_series(event.target.parentNode); + }; + listItemDetailsEl.style.cursor = "pointer"; listItemEl.appendChild(listItemDetailsEl); listEl.appendChild(listItemEl); } -- cgit v1.3