From 96435ba60e22bf0a82d777fc271cb6e1e2edc3f5 Mon Sep 17 00:00:00 2001 From: ivarlovlie Date: Sun, 4 Dec 2022 14:16:57 +0900 Subject: fea: !WIP nrk radio --- src/Services/NrkRadioService.cs | 63 +++++++++++++++++++++++++++++++++++------ 1 file changed, 55 insertions(+), 8 deletions(-) (limited to 'src/Services') diff --git a/src/Services/NrkRadioService.cs b/src/Services/NrkRadioService.cs index a2889ce..d4e06a5 100644 --- a/src/Services/NrkRadioService.cs +++ b/src/Services/NrkRadioService.cs @@ -7,23 +7,70 @@ public class NrkRadioService private readonly IMemoryCache _cache; private readonly HttpClient _http; private const string CATEGORY_SEARCH_CACHE_KEY = "category_search"; + private readonly ILogger _logger; - public NrkRadioService(IMemoryCache cache, HttpClient http) { + public NrkRadioService(IMemoryCache cache, HttpClient http, ILogger logger) { _cache = cache; http.BaseAddress = new Uri("https://psapi.nrk.no"); _http = http; + _logger = logger; } - public async Task GetEverythingAsync() { - var path = "/radio/search/categories/alt-innhold"; - var everything = new List(); - while (path.HasValue()) { - var response = await _http.GetFromJsonAsync(path); - + public async Task CreateIndex() { + 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"; + 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 { + Name = series.Title, + NrkId = series.Id, + Type = series.Type, + }; + var seriesId = RadioIndexDb.AddSeries(dbSeries); + _logger.LogInformation("Added series {0} with id {1}, to the database", dbSeries.Name, seriesId); + if (!series.Links.Series.Href.HasValue()) 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); + } + } + } + } + + path = response.Links.NextPage.Href.HasValue() ? response.Links.NextPage.Href : ""; + } } } - public async Task SearchCategoriesAsync(string query, int take = 50, int skip = 50) { + 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