mirror of https://github.com/ErsatzTV/ErsatzTV.git
11 changed files with 2708 additions and 36 deletions
@ -0,0 +1,121 @@
@@ -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 @@
@@ -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 @@
@@ -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