Feature: All bussiness units get a tile
This commit is contained in:
@@ -34,9 +34,10 @@ public class ContentRefreshService : IContentRefreshService
|
||||
/// <summary>
|
||||
/// Refreshes latest content from SRF API using Play v3.
|
||||
/// </summary>
|
||||
/// <param name="businessUnit">The business unit to fetch content for (e.g. "srf", "rts").</param>
|
||||
/// <param name="cancellationToken">The cancellation token.</param>
|
||||
/// <returns>List of URNs for new content.</returns>
|
||||
public async Task<List<string>> RefreshLatestContentAsync(CancellationToken cancellationToken)
|
||||
public async Task<List<string>> RefreshLatestContentAsync(string businessUnit, CancellationToken cancellationToken)
|
||||
{
|
||||
var config = Plugin.Instance?.Configuration;
|
||||
if (config == null || !config.EnableLatestContent)
|
||||
@@ -46,7 +47,7 @@ public class ContentRefreshService : IContentRefreshService
|
||||
}
|
||||
|
||||
return await FetchVideosFromShowsAsync(
|
||||
config.BusinessUnit.ToLowerString(),
|
||||
businessUnit,
|
||||
minEpisodeCount: 0,
|
||||
maxShows: 20,
|
||||
videosPerShow: 1,
|
||||
@@ -58,9 +59,10 @@ public class ContentRefreshService : IContentRefreshService
|
||||
/// Refreshes trending content from SRF API using Play v3.
|
||||
/// Gets videos from shows with the most episodes.
|
||||
/// </summary>
|
||||
/// <param name="businessUnit">The business unit to fetch content for (e.g. "srf", "rts").</param>
|
||||
/// <param name="cancellationToken">The cancellation token.</param>
|
||||
/// <returns>List of URNs for trending content.</returns>
|
||||
public async Task<List<string>> RefreshTrendingContentAsync(CancellationToken cancellationToken)
|
||||
public async Task<List<string>> RefreshTrendingContentAsync(string businessUnit, CancellationToken cancellationToken)
|
||||
{
|
||||
var config = Plugin.Instance?.Configuration;
|
||||
if (config == null || !config.EnableTrendingContent)
|
||||
@@ -70,7 +72,7 @@ public class ContentRefreshService : IContentRefreshService
|
||||
}
|
||||
|
||||
return await FetchVideosFromShowsAsync(
|
||||
config.BusinessUnit.ToLowerString(),
|
||||
businessUnit,
|
||||
minEpisodeCount: 10,
|
||||
maxShows: 15,
|
||||
videosPerShow: 2,
|
||||
|
||||
@@ -12,14 +12,16 @@ public interface IContentRefreshService
|
||||
/// <summary>
|
||||
/// Refreshes latest content from SRF API using Play v3.
|
||||
/// </summary>
|
||||
/// <param name="businessUnit">The business unit to fetch content for (e.g. "srf", "rts").</param>
|
||||
/// <param name="cancellationToken">The cancellation token.</param>
|
||||
/// <returns>List of URNs for new content.</returns>
|
||||
Task<List<string>> RefreshLatestContentAsync(CancellationToken cancellationToken);
|
||||
Task<List<string>> RefreshLatestContentAsync(string businessUnit, CancellationToken cancellationToken);
|
||||
|
||||
/// <summary>
|
||||
/// Refreshes trending content from SRF API using Play v3.
|
||||
/// </summary>
|
||||
/// <param name="businessUnit">The business unit to fetch content for (e.g. "srf", "rts").</param>
|
||||
/// <param name="cancellationToken">The cancellation token.</param>
|
||||
/// <returns>List of URNs for trending content.</returns>
|
||||
Task<List<string>> RefreshTrendingContentAsync(CancellationToken cancellationToken);
|
||||
Task<List<string>> RefreshTrendingContentAsync(string businessUnit, CancellationToken cancellationToken);
|
||||
}
|
||||
|
||||
@@ -148,18 +148,25 @@ public class RecordingService : IRecordingService, IDisposable
|
||||
public async Task<IReadOnlyList<PlayV3TvProgram>> GetUpcomingScheduleAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
var config = Plugin.Instance?.Configuration;
|
||||
var businessUnit = (config?.BusinessUnit ?? Configuration.BusinessUnit.SRF).ToString().ToLowerInvariant();
|
||||
var units = config?.ResolveEnabledUnits() ?? new[] { Configuration.BusinessUnit.SRF };
|
||||
|
||||
using var apiClient = _apiClientFactory.CreateClient();
|
||||
var livestreams = await apiClient.GetScheduledLivestreamsAsync(businessUnit, "SPORT", cancellationToken).ConfigureAwait(false);
|
||||
|
||||
if (livestreams == null)
|
||||
// Aggregate sport livestreams across every enabled business unit so the recordings
|
||||
// page shows events from all enabled languages.
|
||||
var all = new List<PlayV3TvProgram>();
|
||||
foreach (var unit in units)
|
||||
{
|
||||
return Array.Empty<PlayV3TvProgram>();
|
||||
var businessUnit = unit.ToString().ToLowerInvariant();
|
||||
var livestreams = await apiClient.GetScheduledLivestreamsAsync(businessUnit, "SPORT", cancellationToken).ConfigureAwait(false);
|
||||
if (livestreams != null)
|
||||
{
|
||||
all.AddRange(livestreams);
|
||||
}
|
||||
}
|
||||
|
||||
// Filter to only future/current livestreams that aren't blocked
|
||||
return livestreams
|
||||
return all
|
||||
.Where(ls => ls.Blocked != true && (ls.ValidTo == null || ls.ValidTo.Value.ToUniversalTime() > DateTime.UtcNow))
|
||||
.OrderBy(ls => ls.ValidFrom)
|
||||
.ToList();
|
||||
@@ -178,9 +185,11 @@ public class RecordingService : IRecordingService, IDisposable
|
||||
return existing;
|
||||
}
|
||||
|
||||
// Fetch metadata for the URN
|
||||
// Fetch metadata for the URN. The unit is encoded in the URN itself, so use that to
|
||||
// query the right schedule regardless of which units are enabled.
|
||||
var config = Plugin.Instance?.Configuration;
|
||||
var businessUnit = (config?.BusinessUnit ?? Configuration.BusinessUnit.SRF).ToString().ToLowerInvariant();
|
||||
var businessUnit = ParseBusinessUnitFromUrn(urn)
|
||||
?? (config?.BusinessUnit ?? Configuration.BusinessUnit.SRF).ToString().ToLowerInvariant();
|
||||
|
||||
using var apiClient = _apiClientFactory.CreateClient();
|
||||
var livestreams = await apiClient.GetScheduledLivestreamsAsync(businessUnit, "SPORT", cancellationToken).ConfigureAwait(false);
|
||||
@@ -190,6 +199,7 @@ public class RecordingService : IRecordingService, IDisposable
|
||||
{
|
||||
Id = Guid.NewGuid().ToString("N"),
|
||||
Urn = urn,
|
||||
BusinessUnit = ParseBusinessUnitFromUrn(urn) ?? businessUnit,
|
||||
Title = program?.Title ?? urn,
|
||||
Description = program?.Lead ?? program?.Description,
|
||||
ImageUrl = program?.ImageUrl,
|
||||
@@ -206,6 +216,24 @@ public class RecordingService : IRecordingService, IDisposable
|
||||
return entry;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Extracts the business unit from an SRF URN of the form "urn:<bu>:<type>:...".
|
||||
/// </summary>
|
||||
/// <param name="urn">The URN.</param>
|
||||
/// <returns>The lowercase business unit, or null if it cannot be determined.</returns>
|
||||
private static string? ParseBusinessUnitFromUrn(string urn)
|
||||
{
|
||||
if (string.IsNullOrEmpty(urn))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var parts = urn.Split(':');
|
||||
return parts.Length >= 2 && !string.IsNullOrEmpty(parts[1])
|
||||
? parts[1].ToLowerInvariant()
|
||||
: null;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public bool CancelRecording(string recordingId)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user