diff options
| author | ivarlovlie <git@ivarlovlie.no> | 2022-12-05 06:03:54 +0100 |
|---|---|---|
| committer | ivarlovlie <git@ivarlovlie.no> | 2022-12-05 06:03:54 +0100 |
| commit | 973370074414ad5ab8f2c401001793294822bf16 (patch) | |
| tree | 289f58012ac96287a94a25e4c0564eb3433a65a7 | |
| parent | 394171ed0c7d0edeb98a3be3e076ce130caf085e (diff) | |
| download | lettnytt-973370074414ad5ab8f2c401001793294822bf16.tar.xz lettnytt-973370074414ad5ab8f2c401001793294822bf16.zip | |
feat: WIP! radio series details
| -rw-r--r-- | src/Endpoints/GetRadioSeriesDetails.cs | 26 | ||||
| -rw-r--r-- | src/Endpoints/GetRadioSeriesList.cs | 14 | ||||
| -rw-r--r-- | src/RadioIndexDb.cs | 21 | ||||
| -rw-r--r-- | src/wwwroot/radio.js | 25 |
4 files changed, 80 insertions, 6 deletions
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<RadioSeason> Seasons { get; set; } + public List<RadioEpisode> 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<ActionResult> HandleAsync(string q) { - return Ok(RadioIndexDb.GetSeries(q)); + public async Task<ActionResult<List<Response>>> 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<RadioSeries>(@"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<RadioSeries>(@"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<SeriesDetails>(@" + 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<RadioSeason> Seasons { get; set; } + public List<RadioEpisode> 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("<b>", "") + .replaceAll("</b>", ""); + }); 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], "<b>", "</b>"); + } } } +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 = "<span>" + serie.name + "</span>"; listItemDetailsEl.appendChild(listItemDetailsSummaryEl); + listItemDetailsEl.ontoggle = (event) => { + expand_series(event.target.parentNode); + }; + listItemDetailsEl.style.cursor = "pointer"; listItemEl.appendChild(listItemDetailsEl); listEl.appendChild(listItemEl); } |
