mirror of https://github.com/ErsatzTV/ErsatzTV.git
11 changed files with 2708 additions and 36 deletions
@ -0,0 +1,121 @@ |
|||||||
|
using System.Collections.Generic; |
||||||
|
using ErsatzTV.Core.Domain; |
||||||
|
using ErsatzTV.Core.Jellyfin; |
||||||
|
using FluentAssertions; |
||||||
|
using Flurl; |
||||||
|
using NUnit.Framework; |
||||||
|
using static LanguageExt.Prelude; |
||||||
|
|
||||||
|
namespace ErsatzTV.Core.Tests.Jellyfin |
||||||
|
{ |
||||||
|
public class JellyfinUrlTests |
||||||
|
{ |
||||||
|
[Test] |
||||||
|
public void Should_Work_Without_Trailing_Slash() |
||||||
|
{ |
||||||
|
var artwork = "jellyfin://Items/2/Images/3?tag=4"; |
||||||
|
var address = "https://some.jellyfin.server"; |
||||||
|
var mediaSource = new JellyfinMediaSource |
||||||
|
{ |
||||||
|
Connections = new List<JellyfinConnection> |
||||||
|
{ |
||||||
|
new() { Address = address } |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
Url url = JellyfinUrl.ForArtwork(Some(mediaSource), artwork); |
||||||
|
|
||||||
|
url.ToString().Should().Be("https://some.jellyfin.server/Items/2/Images/3?tag=4"); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void Should_Work_With_Trailing_Slash() |
||||||
|
{ |
||||||
|
var artwork = "jellyfin://Items/2/Images/3?tag=4"; |
||||||
|
var address = "https://some.jellyfin.server/"; |
||||||
|
var mediaSource = new JellyfinMediaSource |
||||||
|
{ |
||||||
|
Connections = new List<JellyfinConnection> |
||||||
|
{ |
||||||
|
new() { Address = address } |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
Url url = JellyfinUrl.ForArtwork(Some(mediaSource), artwork); |
||||||
|
|
||||||
|
url.ToString().Should().Be("https://some.jellyfin.server/Items/2/Images/3?tag=4"); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void Should_Work_With_Port_Without_Trailing_Slash() |
||||||
|
{ |
||||||
|
var artwork = "jellyfin://Items/2/Images/3?tag=4"; |
||||||
|
var address = "https://some.jellyfin.server:1000"; |
||||||
|
var mediaSource = new JellyfinMediaSource |
||||||
|
{ |
||||||
|
Connections = new List<JellyfinConnection> |
||||||
|
{ |
||||||
|
new() { Address = address } |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
Url url = JellyfinUrl.ForArtwork(Some(mediaSource), artwork); |
||||||
|
|
||||||
|
url.ToString().Should().Be("https://some.jellyfin.server:1000/Items/2/Images/3?tag=4"); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void Should_Work_With_Port_With_Trailing_Slash() |
||||||
|
{ |
||||||
|
var artwork = "jellyfin://Items/2/Images/3?tag=4"; |
||||||
|
var address = "https://some.jellyfin.server:1000/"; |
||||||
|
var mediaSource = new JellyfinMediaSource |
||||||
|
{ |
||||||
|
Connections = new List<JellyfinConnection> |
||||||
|
{ |
||||||
|
new() { Address = address } |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
Url url = JellyfinUrl.ForArtwork(Some(mediaSource), artwork); |
||||||
|
|
||||||
|
url.ToString().Should().Be("https://some.jellyfin.server:1000/Items/2/Images/3?tag=4"); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void Should_Work_With_Path_Prefix_Without_Trailing_Slash() |
||||||
|
{ |
||||||
|
var artwork = "jellyfin://Items/2/Images/3?tag=4"; |
||||||
|
var address = "https://some.jellyfin.server/jellyfin"; |
||||||
|
var mediaSource = new JellyfinMediaSource |
||||||
|
{ |
||||||
|
Connections = new List<JellyfinConnection> |
||||||
|
{ |
||||||
|
new() { Address = address } |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
Url url = JellyfinUrl.ForArtwork(Some(mediaSource), artwork); |
||||||
|
|
||||||
|
url.ToString().Should().Be("https://some.jellyfin.server/jellyfin/Items/2/Images/3?tag=4"); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void Should_Work_With_Path_Prefix_With_Trailing_Slash() |
||||||
|
{ |
||||||
|
var artwork = "jellyfin://Items/2/Images/3?tag=4"; |
||||||
|
var address = "https://some.jellyfin.server/jellyfin/"; |
||||||
|
var mediaSource = new JellyfinMediaSource |
||||||
|
{ |
||||||
|
Connections = new List<JellyfinConnection> |
||||||
|
{ |
||||||
|
new() { Address = address } |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
Url url = JellyfinUrl.ForArtwork(Some(mediaSource), artwork); |
||||||
|
|
||||||
|
url.ToString().Should().Be("https://some.jellyfin.server/jellyfin/Items/2/Images/3?tag=4"); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,31 @@ |
|||||||
|
using ErsatzTV.Core.Domain; |
||||||
|
using Flurl; |
||||||
|
using LanguageExt; |
||||||
|
|
||||||
|
namespace ErsatzTV.Core.Jellyfin |
||||||
|
{ |
||||||
|
public static class JellyfinUrl |
||||||
|
{ |
||||||
|
public static Url ForArtwork(Option<JellyfinMediaSource> maybeJellyfin, string artwork) |
||||||
|
{ |
||||||
|
string address = maybeJellyfin.Map(ms => ms.Connections.HeadOrNone().Map(c => c.Address)) |
||||||
|
.Flatten() |
||||||
|
.IfNone("jellyfin://"); |
||||||
|
|
||||||
|
string[] split = artwork.Replace("jellyfin://", string.Empty).Split('?'); |
||||||
|
if (split.Length != 2) |
||||||
|
{ |
||||||
|
return artwork; |
||||||
|
} |
||||||
|
|
||||||
|
string pathSegment = split[0]; |
||||||
|
QueryParamCollection query = Url.ParseQueryParams(split[1]); |
||||||
|
|
||||||
|
Url x = Url.Parse(address) |
||||||
|
.AppendPathSegment(pathSegment) |
||||||
|
.SetQueryParams(query); |
||||||
|
|
||||||
|
return x; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@ |
|||||||
|
using Microsoft.EntityFrameworkCore.Migrations; |
||||||
|
|
||||||
|
namespace ErsatzTV.Infrastructure.Migrations |
||||||
|
{ |
||||||
|
public partial class Update_JellyfinArtworkPath : Migration |
||||||
|
{ |
||||||
|
protected override void Up(MigrationBuilder migrationBuilder) => |
||||||
|
migrationBuilder.Sql( |
||||||
|
@"UPDATE Artwork SET Path = REPLACE(Path, 'jellyfin:///Items', 'jellyfin://Items')
|
||||||
|
WHERE Path LIKE 'jellyfin:///Items%'");
|
||||||
|
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder) |
||||||
|
{ |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue