aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Endpoints/GetRadioSeriesDetails.cs26
-rw-r--r--src/Endpoints/GetRadioSeriesList.cs14
-rw-r--r--src/RadioIndexDb.cs21
-rw-r--r--src/wwwroot/radio.js25
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);
}