Duncan Tourolle ac6a3842dd
Some checks failed
🏗️ Build Plugin / call (push) Failing after 0s
📝 Create/Update Release Draft & Release Bump PR / call (push) Failing after 0s
🧪 Test Plugin / call (push) Failing after 0s
🔬 Run CodeQL / call (push) Failing after 0s
first commit
2025-11-12 22:05:36 +01:00

221 lines
9.7 KiB
C#

using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Jellyfin.Plugin.SRFPlay.Api;
using Microsoft.Extensions.Logging;
namespace Jellyfin.Plugin.SRFPlay.Tests
{
public class TestPlayV3Api
{
public static async Task RunTests()
{
Console.WriteLine("=== Play v3 API Test Suite ===\n");
using var loggerFactory = LoggerFactory.Create(builder =>
{
builder.AddConsole();
builder.SetMinimumLevel(LogLevel.Warning);
});
var apiClient = new SRFApiClient(loggerFactory);
var cancellationToken = CancellationToken.None;
// Test 1: Get all shows
Console.WriteLine("[Test 1] Fetch All Shows");
Console.WriteLine("------------------------");
try
{
var shows = await apiClient.GetAllShowsAsync("srf", cancellationToken);
if (shows != null && shows.Any())
{
Console.WriteLine($"✓ Successfully fetched {shows.Count} shows");
Console.WriteLine($" First show: {shows[0]?.Title} ({shows[0]?.NumberOfEpisodes} episodes)");
Console.WriteLine($" Show ID: {shows[0]?.Id}");
Console.WriteLine($" URN: {shows[0]?.Urn}");
}
else
{
Console.WriteLine("✗ Failed: No shows returned");
}
}
catch (Exception ex)
{
Console.WriteLine($"✗ Error: {ex.Message}");
}
Console.WriteLine();
// Test 2: Get videos for a show
Console.WriteLine("[Test 2] Fetch Videos for a Show");
Console.WriteLine("--------------------------------");
try
{
var shows = await apiClient.GetAllShowsAsync("srf", cancellationToken);
if (shows != null && shows.Any())
{
// Find a show with episodes
var showWithEpisodes = shows.FirstOrDefault(s => s.NumberOfEpisodes > 0);
if (showWithEpisodes != null && showWithEpisodes.Id != null)
{
Console.WriteLine($"Testing with show: {showWithEpisodes.Title}");
var videos = await apiClient.GetVideosForShowAsync("srf", showWithEpisodes.Id, cancellationToken);
if (videos != null && videos.Any())
{
Console.WriteLine($"✓ Successfully fetched {videos.Count} videos");
var firstVideo = videos[0];
Console.WriteLine($" First video: {firstVideo?.Title}");
Console.WriteLine($" URN: {firstVideo?.Urn}");
Console.WriteLine($" Duration: {firstVideo?.Duration / 1000}s");
Console.WriteLine($" Date: {firstVideo?.Date}");
Console.WriteLine($" Playable abroad: {firstVideo?.PlayableAbroad}");
}
else
{
Console.WriteLine("✗ Failed: No videos returned");
}
}
else
{
Console.WriteLine("✗ Failed: No shows with episodes found");
}
}
}
catch (Exception ex)
{
Console.WriteLine($"✗ Error: {ex.Message}");
}
Console.WriteLine();
// Test 3: Get video stream URL using Integration Layer
Console.WriteLine("[Test 3] Get Stream URL for Video");
Console.WriteLine("---------------------------------");
try
{
var shows = await apiClient.GetAllShowsAsync("srf", cancellationToken);
if (shows != null && shows.Any())
{
var showWithEpisodes = shows.FirstOrDefault(s => s.NumberOfEpisodes > 0);
if (showWithEpisodes != null && showWithEpisodes.Id != null)
{
var videos = await apiClient.GetVideosForShowAsync("srf", showWithEpisodes.Id, cancellationToken);
if (videos != null && videos.Any())
{
var video = videos[0];
if (video.Urn != null)
{
Console.WriteLine($"Fetching stream for: {video.Title}");
// Use Integration Layer 2.0 to get stream URL
var mediaComposition = await apiClient.GetMediaCompositionByUrnAsync(video.Urn, cancellationToken);
if (mediaComposition?.ChapterList != null && mediaComposition.ChapterList.Any())
{
var chapter = mediaComposition.ChapterList[0];
if (chapter.ResourceList != null && chapter.ResourceList.Any())
{
var hlsResource = chapter.ResourceList.FirstOrDefault(r =>
r.Protocol == "HLS" && (r.DrmList == null || r.DrmList.ToString() == "[]"));
if (hlsResource != null)
{
Console.WriteLine($"✓ Stream URL found:");
Console.WriteLine($" URL: {hlsResource.Url?.Substring(0, Math.Min(80, hlsResource.Url?.Length ?? 0))}...");
Console.WriteLine($" Quality: {hlsResource.Quality}");
Console.WriteLine($" Protocol: {hlsResource.Protocol}");
}
else
{
Console.WriteLine("✗ No HLS stream without DRM found");
}
}
else
{
Console.WriteLine("✗ No resources found");
}
}
else
{
Console.WriteLine("✗ Failed to fetch media composition");
}
}
}
}
}
}
catch (Exception ex)
{
Console.WriteLine($"✗ Error: {ex.Message}");
}
Console.WriteLine();
// Test 4: Check multiple shows
Console.WriteLine("[Test 4] Check Multiple Shows");
Console.WriteLine("----------------------------");
try
{
var shows = await apiClient.GetAllShowsAsync("srf", cancellationToken);
if (shows != null)
{
var showsWithEpisodes = shows.Where(s => s.NumberOfEpisodes > 0).Take(10).ToList();
Console.WriteLine($"Checking {showsWithEpisodes.Count} shows with episodes...\n");
int successCount = 0;
foreach (var show in showsWithEpisodes)
{
if (show.Id != null)
{
var videos = await apiClient.GetVideosForShowAsync("srf", show.Id, cancellationToken);
if (videos != null && videos.Any())
{
Console.WriteLine($"✓ {show.Title}: {videos.Count} videos available");
successCount++;
}
else
{
Console.WriteLine($"✗ {show.Title}: No videos found");
}
}
}
Console.WriteLine();
Console.WriteLine($"Summary: {successCount}/{showsWithEpisodes.Count} shows successfully fetched videos");
}
}
catch (Exception ex)
{
Console.WriteLine($"✗ Error: {ex.Message}");
}
Console.WriteLine();
// Test 5: Test all business units
Console.WriteLine("[Test 5] Test All Business Units");
Console.WriteLine("--------------------------------");
var businessUnits = new[] { "srf", "rts", "rsi", "rtr", "swi" };
foreach (var bu in businessUnits)
{
try
{
var shows = await apiClient.GetAllShowsAsync(bu, cancellationToken);
if (shows != null && shows.Any())
{
Console.WriteLine($"✓ {bu.ToUpper()}: {shows.Count} shows available");
}
else
{
Console.WriteLine($"✗ {bu.ToUpper()}: No shows found");
}
}
catch (Exception ex)
{
Console.WriteLine($"✗ {bu.ToUpper()}: Error - {ex.Message}");
}
}
Console.WriteLine();
Console.WriteLine("=== Test Suite Complete ===");
}
}
}