From 2ea053d4c436a79d77b205d3d74716244da91058 Mon Sep 17 00:00:00 2001 From: ivarlovlie Date: Sun, 4 Dec 2022 17:54:53 +0900 Subject: feat: Initial indexing of seasons and episode is working --- src/Services/NrkRadioService.cs | 72 ++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 29 deletions(-) (limited to 'src/Services/NrkRadioService.cs') diff --git a/src/Services/NrkRadioService.cs b/src/Services/NrkRadioService.cs index d4e06a5..7077d16 100644 --- a/src/Services/NrkRadioService.cs +++ b/src/Services/NrkRadioService.cs @@ -17,51 +17,41 @@ public class NrkRadioService } public async Task CreateIndex() { - var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ".ToCharArray(); + var letters = "#ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ".ToCharArray(); var skip = 0; foreach (var letter in letters) { - var path = "/radio/search/categories/alt-innhold?letter=" + letter + "&skip=0&take=50"; + + // TODO: Support series._links.podcast in addition to series._links.seasons + var path = "/radio/search/categories/alt-innhold?letter=" + letter == "#" ? "%23" : letter + "&skip=0&take=50"; while (path.HasValue()) { var response = await _http.GetFromJsonAsync(path); if (response == default) break; await Task.Delay(2000); foreach (var series in response.Series) { - var dbSeries = new RadioSeries { + var dbSeries = RadioIndexDb.GetSeriesByNrkId(series.Id) ?? new RadioSeries { Name = series.Title, NrkId = series.Id, Type = series.Type, }; - var seriesId = RadioIndexDb.AddSeries(dbSeries); + var seriesId = dbSeries.Id > 0 ? dbSeries.Id : RadioIndexDb.AddSeries(dbSeries); _logger.LogInformation("Added series {0} with id {1}, to the database", dbSeries.Name, seriesId); - if (!series.Links.Series.Href.HasValue()) continue; + if (!series.Links?.Series?.Href?.HasValue() ?? true) continue; var seriesMetadata = await _http.GetFromJsonAsync(series.Links.Series.Href); if (seriesMetadata == default) continue; await Task.Delay(1000); - foreach (var season in seriesMetadata.Embedded.Seasons) { - var dbSeason = new RadioSeason() { - Name = season.Titles.FirstOrDefault()?.Title, - NrkId = season.Id, - SeriesId = seriesId - }; - var seasonId = RadioIndexDb.AddSeason(dbSeason); - _logger.LogInformation("Added season {0} to series {1} with id {2}, to the database", dbSeason.Name, dbSeries.Name, seasonId); - foreach (var episode in season.Episodes) { - foreach (var actuallyEpisode in episode.Embedded.Episodes) { - var dbEpisode = new RadioEpisode { - CanonicalUrl = actuallyEpisode.Links.Share.Href, - Title = actuallyEpisode.Titles.FirstOrDefault()?.Title, - Subtitle = actuallyEpisode.Titles.FirstOrDefault()?.Subtitle, - NrkId = actuallyEpisode.EpisodeId, - SeasonId = seasonId, - SeriesId = dbSeason.SeriesId - }; - var playbackResponse = await _http.GetFromJsonAsync("/playback/manifest/program/" + dbEpisode.NrkId); - if (playbackResponse == default) continue; - dbEpisode.SourceUrl = playbackResponse.Playable.Assets.FirstOrDefault()?.Url; - var episodeId = RadioIndexDb.AddEpisode(dbEpisode); - _logger.LogInformation("Added episode {0} to series {1} season {2} with id {3}, to the database", dbEpisode.Title, dbSeries.Name, dbSeason.Name, episodeId); - } + if (seriesMetadata.Embedded.Seasons?.Any() ?? false) { + foreach (var season in seriesMetadata.Embedded.Seasons) { + var dbSeason = RadioIndexDb.GetSeasonByNrkId(season.Id) ?? new RadioSeason() { + Name = season.Titles.Title, + NrkId = season.Id, + SeriesId = seriesId + }; + var seasonId = dbSeason.Id > 0 ? dbSeason.Id : RadioIndexDb.AddSeason(dbSeason); + _logger.LogInformation("Added season {0} to series {1} with id {2}, to the database", dbSeason.Name, dbSeries.Name, seasonId); + await AddEpisodesAsync(season.Episodes.Embedded.Episodes, dbSeries, dbSeason); } + } else if (seriesMetadata.Embedded.Episodes.Embedded.Episodes?.Any() ?? false) { + await AddEpisodesAsync(seriesMetadata.Embedded.Episodes.Embedded.Episodes, dbSeries); } } @@ -70,6 +60,30 @@ public class NrkRadioService } } + private async Task AddEpisodesAsync(List lol, RadioSeries dbSeries, RadioSeason dbSeason = default) { + foreach (var episode in lol) { + var dbEpisode = RadioIndexDb.GetEpisodeByNrkId(episode.EpisodeId) ?? new RadioEpisode { + CanonicalUrl = episode.Links.Share.Href, + Name = episode.Titles.Title, + Description = episode.Titles.Subtitle, + NrkId = episode.EpisodeId, + SeasonId = dbSeason?.Id ?? -1, + SeriesId = dbSeries.Id + }; + + if (dbEpisode.NrkId.IsNullOrWhiteSpace()) { + _logger.LogWarning("No nrk id was found for episode {0}", dbEpisode.Name); + continue; + } + + var playbackResponse = await _http.GetFromJsonAsync("/playback/manifest/program/" + dbEpisode.NrkId); + if (playbackResponse == default) continue; + dbEpisode.SourceUrl = playbackResponse.Playable.Assets.FirstOrDefault()?.Url; + var episodeId = dbEpisode.Id > 0 ? dbEpisode.Id : RadioIndexDb.AddEpisode(dbEpisode); + _logger.LogInformation("Added episode {0} to series {1} season {2} with id {3}, to the database", dbEpisode.Name, dbSeries.Name, dbSeason?.Name ?? "!!NO SEASON!!", episodeId); + } + } + public async Task SearchCategoriesAsync(string query, int take = 50, int skip = 0) { return await _http.GetFromJsonAsync( "/radio/search/categories/alt-innhold?q=" + query + "&take=" + take + "&skip=" + skip -- cgit v1.3