aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCody Robibero <cody@robibe.ro>2024-02-08 08:17:08 -0700
committerGitHub <noreply@github.com>2024-02-08 08:17:08 -0700
commit20f05f8103c2f5447c3d2ebd319c9ad31857d42e (patch)
treee77251f57bf9468969539c25bc71b9f072ca80e3 /src
parent5ad7e4b7490a5f8756e89fd3dac5077a9acc7cbe (diff)
parent584636bdd8ea95d56b3c1cda97ce6efa8ce1543c (diff)
Merge pull request #10847 from barronpm/schedulesdirect-fix
SchedulesDirect fix
Diffstat (limited to 'src')
-rw-r--r--src/Jellyfin.LiveTv/Listings/SchedulesDirect.cs78
1 files changed, 42 insertions, 36 deletions
diff --git a/src/Jellyfin.LiveTv/Listings/SchedulesDirect.cs b/src/Jellyfin.LiveTv/Listings/SchedulesDirect.cs
index b237f5b16..c7a57859e 100644
--- a/src/Jellyfin.LiveTv/Listings/SchedulesDirect.cs
+++ b/src/Jellyfin.LiveTv/Listings/SchedulesDirect.cs
@@ -106,8 +106,7 @@ namespace Jellyfin.LiveTv.Listings
using var options = new HttpRequestMessage(HttpMethod.Post, ApiUrl + "/schedules");
options.Content = JsonContent.Create(requestList, options: _jsonOptions);
options.Headers.TryAddWithoutValidation("token", token);
- using var response = await Send(options, true, info, cancellationToken).ConfigureAwait(false);
- var dailySchedules = await response.Content.ReadFromJsonAsync<IReadOnlyList<DayDto>>(_jsonOptions, cancellationToken).ConfigureAwait(false);
+ var dailySchedules = await Request<IReadOnlyList<DayDto>>(options, true, info, cancellationToken).ConfigureAwait(false);
if (dailySchedules is null)
{
return Array.Empty<ProgramInfo>();
@@ -121,8 +120,8 @@ namespace Jellyfin.LiveTv.Listings
var programIds = dailySchedules.SelectMany(d => d.Programs.Select(s => s.ProgramId)).Distinct();
programRequestOptions.Content = JsonContent.Create(programIds, options: _jsonOptions);
- using var innerResponse = await Send(programRequestOptions, true, info, cancellationToken).ConfigureAwait(false);
- var programDetails = await innerResponse.Content.ReadFromJsonAsync<IReadOnlyList<ProgramDetailsDto>>(_jsonOptions, cancellationToken).ConfigureAwait(false);
+ var programDetails = await Request<IReadOnlyList<ProgramDetailsDto>>(programRequestOptions, true, info, cancellationToken)
+ .ConfigureAwait(false);
if (programDetails is null)
{
return Array.Empty<ProgramInfo>();
@@ -472,16 +471,13 @@ namespace Jellyfin.LiveTv.Listings
str.Length--;
str.Append(']');
- using var message = new HttpRequestMessage(HttpMethod.Post, ApiUrl + "/metadata/programs")
- {
- Content = new StringContent(str.ToString(), Encoding.UTF8, MediaTypeNames.Application.Json)
- };
+ using var message = new HttpRequestMessage(HttpMethod.Post, ApiUrl + "/metadata/programs");
message.Headers.TryAddWithoutValidation("token", token);
+ message.Content = new StringContent(str.ToString(), Encoding.UTF8, MediaTypeNames.Application.Json);
try
{
- using var innerResponse2 = await Send(message, true, info, cancellationToken).ConfigureAwait(false);
- return await innerResponse2.Content.ReadFromJsonAsync<IReadOnlyList<ShowImagesDto>>(_jsonOptions, cancellationToken).ConfigureAwait(false);
+ return await Request<IReadOnlyList<ShowImagesDto>>(message, true, info, cancellationToken).ConfigureAwait(false);
}
catch (Exception ex)
{
@@ -507,8 +503,7 @@ namespace Jellyfin.LiveTv.Listings
try
{
- using var httpResponse = await Send(options, false, info, cancellationToken).ConfigureAwait(false);
- var root = await httpResponse.Content.ReadFromJsonAsync<IReadOnlyList<HeadendsDto>>(_jsonOptions, cancellationToken).ConfigureAwait(false);
+ var root = await Request<IReadOnlyList<HeadendsDto>>(options, false, info, cancellationToken).ConfigureAwait(false);
if (root is not null)
{
foreach (HeadendsDto headend in root)
@@ -596,36 +591,42 @@ namespace Jellyfin.LiveTv.Listings
}
}
- private async Task<HttpResponseMessage> Send(
- HttpRequestMessage options,
+ private async Task<T> Request<T>(
+ HttpRequestMessage message,
bool enableRetry,
ListingsProviderInfo providerInfo,
CancellationToken cancellationToken,
HttpCompletionOption completionOption = HttpCompletionOption.ResponseContentRead)
{
- var response = await _httpClientFactory.CreateClient(NamedClient.Default)
- .SendAsync(options, completionOption, cancellationToken).ConfigureAwait(false);
+ using var response = await _httpClientFactory.CreateClient(NamedClient.Default)
+ .SendAsync(message, completionOption, cancellationToken)
+ .ConfigureAwait(false);
if (response.IsSuccessStatusCode)
{
- return response;
+ return await response.Content.ReadFromJsonAsync<T>(_jsonOptions, cancellationToken).ConfigureAwait(false);
}
- // Response is automatically disposed in the calling function,
- // so dispose manually if not returning.
-#pragma warning disable IDISP016, IDISP017
- response.Dispose();
if (!enableRetry || (int)response.StatusCode >= 500)
{
+ _logger.LogError(
+ "Request to {Url} failed with response {Response}",
+ message.RequestUri,
+ await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false));
+
throw new HttpRequestException(
string.Format(CultureInfo.InvariantCulture, "Request failed: {0}", response.ReasonPhrase),
null,
response.StatusCode);
}
-#pragma warning restore IDISP016, IDISP017
_tokens.Clear();
- options.Headers.TryAddWithoutValidation("token", await GetToken(providerInfo, cancellationToken).ConfigureAwait(false));
- return await Send(options, false, providerInfo, cancellationToken).ConfigureAwait(false);
+ using var retryMessage = new HttpRequestMessage(message.Method, message.RequestUri);
+ retryMessage.Content = message.Content;
+ retryMessage.Headers.TryAddWithoutValidation(
+ "token",
+ await GetToken(providerInfo, cancellationToken).ConfigureAwait(false));
+
+ return await Request<T>(retryMessage, false, providerInfo, cancellationToken).ConfigureAwait(false);
}
private async Task<string> GetTokenInternal(
@@ -642,9 +643,7 @@ namespace Jellyfin.LiveTv.Listings
string hashedPassword = Convert.ToHexString(hashedPasswordBytes).ToLowerInvariant();
options.Content = new StringContent("{\"username\":\"" + username + "\",\"password\":\"" + hashedPassword + "\"}", Encoding.UTF8, MediaTypeNames.Application.Json);
- using var response = await Send(options, false, null, cancellationToken).ConfigureAwait(false);
- response.EnsureSuccessStatusCode();
- var root = await response.Content.ReadFromJsonAsync<TokenDto>(_jsonOptions, cancellationToken).ConfigureAwait(false);
+ var root = await Request<TokenDto>(options, false, null, cancellationToken).ConfigureAwait(false);
if (string.Equals(root?.Message, "OK", StringComparison.Ordinal))
{
_logger.LogInformation("Authenticated with Schedules Direct token: {Token}", root.Token);
@@ -661,11 +660,21 @@ namespace Jellyfin.LiveTv.Listings
ArgumentException.ThrowIfNullOrEmpty(token);
ArgumentException.ThrowIfNullOrEmpty(info.ListingsId);
- _logger.LogInformation("Adding new LineUp ");
+ _logger.LogInformation("Adding new lineup {Id}", info.ListingsId);
- using var options = new HttpRequestMessage(HttpMethod.Put, ApiUrl + "/lineups/" + info.ListingsId);
- options.Headers.TryAddWithoutValidation("token", token);
- using var response = await _httpClientFactory.CreateClient(NamedClient.Default).SendAsync(options, HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);
+ using var message = new HttpRequestMessage(HttpMethod.Put, ApiUrl + "/lineups/" + info.ListingsId);
+ message.Headers.TryAddWithoutValidation("token", token);
+
+ using var response = await _httpClientFactory.CreateClient(NamedClient.Default)
+ .SendAsync(message, HttpCompletionOption.ResponseHeadersRead, cancellationToken)
+ .ConfigureAwait(false);
+
+ if (!response.IsSuccessStatusCode)
+ {
+ _logger.LogError(
+ "Error adding lineup to account: {Response}",
+ await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false));
+ }
}
private async Task<bool> HasLineup(ListingsProviderInfo info, CancellationToken cancellationToken)
@@ -683,9 +692,7 @@ namespace Jellyfin.LiveTv.Listings
try
{
- using var httpResponse = await Send(options, false, null, cancellationToken).ConfigureAwait(false);
- httpResponse.EnsureSuccessStatusCode();
- var root = await httpResponse.Content.ReadFromJsonAsync<LineupsDto>(_jsonOptions, cancellationToken).ConfigureAwait(false);
+ var root = await Request<LineupsDto>(options, false, null, cancellationToken).ConfigureAwait(false);
return root?.Lineups.Any(i => string.Equals(info.ListingsId, i.Lineup, StringComparison.OrdinalIgnoreCase)) ?? false;
}
catch (HttpRequestException ex)
@@ -738,8 +745,7 @@ namespace Jellyfin.LiveTv.Listings
using var options = new HttpRequestMessage(HttpMethod.Get, ApiUrl + "/lineups/" + listingsId);
options.Headers.TryAddWithoutValidation("token", token);
- using var httpResponse = await Send(options, true, info, cancellationToken).ConfigureAwait(false);
- var root = await httpResponse.Content.ReadFromJsonAsync<ChannelDto>(_jsonOptions, cancellationToken).ConfigureAwait(false);
+ var root = await Request<ChannelDto>(options, true, info, cancellationToken).ConfigureAwait(false);
if (root is null)
{
return new List<ChannelInfo>();