mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-07-15 18:53:27 +01:00
Merge branch 'master' into network-rewrite
This commit is contained in:
@@ -2,7 +2,6 @@ using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using AutoFixture;
|
||||
using AutoFixture.AutoMoq;
|
||||
using Jellyfin.Api.Auth.DefaultAuthorizationPolicy;
|
||||
using Jellyfin.Api.Auth.FirstTimeSetupPolicy;
|
||||
using Jellyfin.Api.Constants;
|
||||
using MediaBrowser.Common.Configuration;
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
using System;
|
||||
using Jellyfin.Api.Controllers;
|
||||
using Xunit;
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ using System;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Text.Json;
|
||||
using Jellyfin.Data.Enums;
|
||||
using Jellyfin.Extensions.Json;
|
||||
using Jellyfin.Extensions.Json.Converters;
|
||||
using MediaBrowser.MediaEncoding.Probing;
|
||||
@@ -314,15 +315,15 @@ namespace Jellyfin.MediaEncoding.Tests.Probing
|
||||
Assert.Equal(DateTime.Parse("2020-10-26T00:00Z", DateTimeFormatInfo.CurrentInfo, DateTimeStyles.AdjustToUniversal), res.PremiereDate);
|
||||
Assert.Equal(22, res.People.Length);
|
||||
Assert.Equal("Krysta Youngs", res.People[0].Name);
|
||||
Assert.Equal(PersonType.Composer, res.People[0].Type);
|
||||
Assert.Equal(PersonKind.Composer, res.People[0].Type);
|
||||
Assert.Equal("Julia Ross", res.People[1].Name);
|
||||
Assert.Equal(PersonType.Composer, res.People[1].Type);
|
||||
Assert.Equal(PersonKind.Composer, res.People[1].Type);
|
||||
Assert.Equal("Yiwoomin", res.People[2].Name);
|
||||
Assert.Equal(PersonType.Composer, res.People[2].Type);
|
||||
Assert.Equal(PersonKind.Composer, res.People[2].Type);
|
||||
Assert.Equal("Ji-hyo Park", res.People[3].Name);
|
||||
Assert.Equal(PersonType.Lyricist, res.People[3].Type);
|
||||
Assert.Equal(PersonKind.Lyricist, res.People[3].Type);
|
||||
Assert.Equal("Yiwoomin", res.People[4].Name);
|
||||
Assert.Equal(PersonType.Actor, res.People[4].Type);
|
||||
Assert.Equal(PersonKind.Actor, res.People[4].Type);
|
||||
Assert.Equal("Electric Piano", res.People[4].Role);
|
||||
Assert.Equal(4, res.Genres.Length);
|
||||
Assert.Contains("Electronic", res.Genres);
|
||||
|
||||
@@ -162,7 +162,7 @@ namespace Jellyfin.Model.Tests
|
||||
[InlineData("Tizen4-4K-5.1", "mkv-vp9-aac-srt-2600k", PlayMethod.DirectPlay)]
|
||||
[InlineData("Tizen4-4K-5.1", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectPlay)]
|
||||
[InlineData("Tizen4-4K-5.1", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay)]
|
||||
public async Task BuildVideoItemSimple(string deviceName, string mediaSource, PlayMethod? playMethod, TranscodeReason why = (TranscodeReason)0, string transcodeMode = "DirectStream", string transcodeProtocol = "")
|
||||
public async Task BuildVideoItemSimple(string deviceName, string mediaSource, PlayMethod? playMethod, TranscodeReason why = default, string transcodeMode = "DirectStream", string transcodeProtocol = "")
|
||||
{
|
||||
var options = await GetMediaOptions(deviceName, mediaSource);
|
||||
BuildVideoItemSimpleTest(options, playMethod, why, transcodeMode, transcodeProtocol);
|
||||
@@ -260,7 +260,7 @@ namespace Jellyfin.Model.Tests
|
||||
[InlineData("Tizen4-4K-5.1", "mkv-vp9-aac-srt-2600k", PlayMethod.DirectPlay)]
|
||||
[InlineData("Tizen4-4K-5.1", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectPlay)]
|
||||
[InlineData("Tizen4-4K-5.1", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay)]
|
||||
public async Task BuildVideoItemWithFirstExplicitStream(string deviceName, string mediaSource, PlayMethod? playMethod, TranscodeReason why = (TranscodeReason)0, string transcodeMode = "DirectStream", string transcodeProtocol = "")
|
||||
public async Task BuildVideoItemWithFirstExplicitStream(string deviceName, string mediaSource, PlayMethod? playMethod, TranscodeReason why = default, string transcodeMode = "DirectStream", string transcodeProtocol = "")
|
||||
{
|
||||
var options = await GetMediaOptions(deviceName, mediaSource);
|
||||
options.AudioStreamIndex = 1;
|
||||
@@ -296,7 +296,7 @@ namespace Jellyfin.Model.Tests
|
||||
// Tizen 4 4K 5.1
|
||||
[InlineData("Tizen4-4K-5.1", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")]
|
||||
[InlineData("Tizen4-4K-5.1", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")]
|
||||
public async Task BuildVideoItemWithDirectPlayExplicitStreams(string deviceName, string mediaSource, PlayMethod? playMethod, TranscodeReason why = (TranscodeReason)0, string transcodeMode = "DirectStream", string transcodeProtocol = "")
|
||||
public async Task BuildVideoItemWithDirectPlayExplicitStreams(string deviceName, string mediaSource, PlayMethod? playMethod, TranscodeReason why = default, string transcodeMode = "DirectStream", string transcodeProtocol = "")
|
||||
{
|
||||
var options = await GetMediaOptions(deviceName, mediaSource);
|
||||
var streamCount = options.MediaSources[0].MediaStreams.Count;
|
||||
|
||||
@@ -236,7 +236,7 @@ namespace Jellyfin.Naming.Tests.Video
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void TestFalsePositive()
|
||||
public void TestMissingParttype()
|
||||
{
|
||||
var files = new[]
|
||||
{
|
||||
@@ -248,9 +248,8 @@ namespace Jellyfin.Naming.Tests.Video
|
||||
|
||||
var result = StackResolver.ResolveFiles(files, _namingOptions).ToList();
|
||||
|
||||
Assert.Single(result);
|
||||
|
||||
TestStackInfo(result[0], "300", 3);
|
||||
// There should be no stack, because all files should be treated as separate movies
|
||||
Assert.Empty(result);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -297,11 +296,11 @@ namespace Jellyfin.Naming.Tests.Video
|
||||
|
||||
var result = StackResolver.ResolveFiles(files, _namingOptions).ToList();
|
||||
|
||||
Assert.Equal(3, result.Count);
|
||||
// Only 'Bad Boys (2006)' and '300 (2006)' should be in the stack
|
||||
Assert.Equal(2, result.Count);
|
||||
|
||||
TestStackInfo(result[0], "300 (2006)", 4);
|
||||
TestStackInfo(result[1], "300", 3);
|
||||
TestStackInfo(result[2], "Bad Boys (2006)", 4);
|
||||
TestStackInfo(result[1], "Bad Boys (2006)", 4);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
||||
@@ -332,7 +332,9 @@ namespace Jellyfin.Naming.Tests.Video
|
||||
files.Select(i => VideoResolver.Resolve(i, false, _namingOptions)).OfType<VideoFileInfo>().ToList(),
|
||||
_namingOptions).ToList();
|
||||
|
||||
Assert.Single(result);
|
||||
// The result should contain two individual movies
|
||||
// Version grouping should not work here, because the files are not in a directory with the name 'Four Sisters and a Wedding'
|
||||
Assert.Equal(2, result.Count);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
||||
@@ -238,9 +238,6 @@ namespace Jellyfin.Providers.Tests.Manager
|
||||
}
|
||||
};
|
||||
|
||||
object? result;
|
||||
List<PersonInfo> actual;
|
||||
|
||||
// overwrite provider id
|
||||
var overwriteNewValue = new List<PersonInfo>
|
||||
{
|
||||
@@ -249,9 +246,9 @@ namespace Jellyfin.Providers.Tests.Manager
|
||||
Name = "Name 2"
|
||||
}
|
||||
};
|
||||
Assert.False(TestMergeBaseItemDataPerson(GetOldValue(), overwriteNewValue, null, false, out result));
|
||||
Assert.False(TestMergeBaseItemDataPerson(GetOldValue(), overwriteNewValue, null, false, out var result));
|
||||
// People not already in target are not merged into it from source
|
||||
actual = (List<PersonInfo>)result!;
|
||||
List<PersonInfo> actual = (List<PersonInfo>)result!;
|
||||
Assert.Single(actual);
|
||||
Assert.Equal("Name 1", actual[0].Name);
|
||||
|
||||
|
||||
@@ -368,8 +368,8 @@ namespace Jellyfin.Providers.Tests.Manager
|
||||
[Theory]
|
||||
[InlineData(nameof(ICustomMetadataProvider), true)]
|
||||
[InlineData(nameof(IRemoteMetadataProvider), true)]
|
||||
[InlineData(nameof(ILocalMetadataProvider), false)]
|
||||
public void GetMetadataProviders_CanRefreshMetadataOwned_WhenNotLocal(string providerType, bool expected)
|
||||
[InlineData(nameof(ILocalMetadataProvider), true)]
|
||||
public void GetMetadataProviders_CanRefreshMetadataOwned(string providerType, bool expected)
|
||||
{
|
||||
GetMetadataProviders_CanRefreshMetadata_Tester(providerType, expected, ownedItem: true);
|
||||
}
|
||||
|
||||
@@ -79,6 +79,35 @@ public class FindExtrasTests
|
||||
Assert.Equal(ExtraType.Sample, extras[2].ExtraType);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void FindExtras_SeparateMovieFolder_CleanExtraNames()
|
||||
{
|
||||
var owner = new Movie { Name = "Up", Path = "/movies/Up/Up.mkv" };
|
||||
var paths = new List<string>
|
||||
{
|
||||
"/movies/Up/Up.mkv",
|
||||
"/movies/Up/Recording the audio[Bluray]-behindthescenes.mkv",
|
||||
"/movies/Up/Interview with the dog-interview.mkv",
|
||||
"/movies/Up/shorts/Balloons[1080p].mkv"
|
||||
};
|
||||
|
||||
var files = paths.Select(p => new FileSystemMetadata
|
||||
{
|
||||
FullName = p,
|
||||
IsDirectory = false
|
||||
}).ToList();
|
||||
|
||||
var extras = _libraryManager.FindExtras(owner, files, new DirectoryService(_fileSystemMock.Object)).OrderBy(e => e.ExtraType).ToList();
|
||||
|
||||
Assert.Equal(3, extras.Count);
|
||||
Assert.Equal(ExtraType.BehindTheScenes, extras[0].ExtraType);
|
||||
Assert.Equal("Recording the audio", extras[0].Name);
|
||||
Assert.Equal(ExtraType.Interview, extras[1].ExtraType);
|
||||
Assert.Equal("Interview with the dog", extras[1].Name);
|
||||
Assert.Equal(ExtraType.Short, extras[2].ExtraType);
|
||||
Assert.Equal("Balloons", extras[2].Name);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void FindExtras_SeparateMovieFolderWithMixedExtras_FindsCorrectExtras()
|
||||
{
|
||||
|
||||
@@ -37,4 +37,27 @@ public sealed class LibraryControllerTests : IClassFixture<JellyfinApplicationFa
|
||||
var response = await client.GetAsync(string.Format(CultureInfo.InvariantCulture, format, Guid.NewGuid())).ConfigureAwait(false);
|
||||
Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("Items/{0}")]
|
||||
[InlineData("Items?ids={0}")]
|
||||
public async Task Delete_NonExistentItemId_Unauthorised(string format)
|
||||
{
|
||||
var client = _factory.CreateClient();
|
||||
|
||||
var response = await client.DeleteAsync(string.Format(CultureInfo.InvariantCulture, format, Guid.NewGuid())).ConfigureAwait(false);
|
||||
Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("Items/{0}")]
|
||||
[InlineData("Items?ids={0}")]
|
||||
public async Task Delete_NonExistentItemId_NotFound(string format)
|
||||
{
|
||||
var client = _factory.CreateClient();
|
||||
client.DefaultRequestHeaders.AddAuthHeader(_accessToken ??= await AuthHelper.CompleteStartupAsync(client).ConfigureAwait(false));
|
||||
|
||||
var response = await client.DeleteAsync(string.Format(CultureInfo.InvariantCulture, format, Guid.NewGuid())).ConfigureAwait(false);
|
||||
Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using Jellyfin.Data.Enums;
|
||||
using MediaBrowser.Common.Configuration;
|
||||
using MediaBrowser.Controller.Entities.TV;
|
||||
using MediaBrowser.Controller.Library;
|
||||
@@ -79,18 +80,18 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers
|
||||
Assert.Equal("1276153", item.ProviderIds[MetadataProvider.Tmdb.ToString()]);
|
||||
|
||||
// Credits
|
||||
var writers = result.People.Where(x => x.Type == PersonType.Writer).ToArray();
|
||||
var writers = result.People.Where(x => x.Type == PersonKind.Writer).ToArray();
|
||||
Assert.Equal(2, writers.Length);
|
||||
Assert.Contains("Bryan Fuller", writers.Select(x => x.Name));
|
||||
Assert.Contains("Michael Green", writers.Select(x => x.Name));
|
||||
|
||||
// Direcotrs
|
||||
var directors = result.People.Where(x => x.Type == PersonType.Director).ToArray();
|
||||
var directors = result.People.Where(x => x.Type == PersonKind.Director).ToArray();
|
||||
Assert.Single(directors);
|
||||
Assert.Contains("David Slade", directors.Select(x => x.Name));
|
||||
|
||||
// Actors
|
||||
var actors = result.People.Where(x => x.Type == PersonType.Actor).ToArray();
|
||||
var actors = result.People.Where(x => x.Type == PersonKind.Actor).ToArray();
|
||||
Assert.Equal(11, actors.Length);
|
||||
// Only test one actor
|
||||
var shadow = actors.FirstOrDefault(x => x.Role.Equals("Shadow Moon", StringComparison.Ordinal));
|
||||
|
||||
@@ -2,6 +2,7 @@ using System;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using Jellyfin.Data.Entities;
|
||||
using Jellyfin.Data.Enums;
|
||||
using MediaBrowser.Common.Configuration;
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Controller.Entities.Movies;
|
||||
@@ -117,18 +118,18 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers
|
||||
|
||||
Assert.Equal(20, result.People.Count);
|
||||
|
||||
var writers = result.People.Where(x => x.Type == PersonType.Writer).ToArray();
|
||||
var writers = result.People.Where(x => x.Type == PersonKind.Writer).ToArray();
|
||||
Assert.Equal(3, writers.Length);
|
||||
var writerNames = writers.Select(x => x.Name);
|
||||
Assert.Contains("Jerry Siegel", writerNames);
|
||||
Assert.Contains("Joe Shuster", writerNames);
|
||||
Assert.Contains("Test", writerNames);
|
||||
|
||||
var directors = result.People.Where(x => x.Type == PersonType.Director).ToArray();
|
||||
var directors = result.People.Where(x => x.Type == PersonKind.Director).ToArray();
|
||||
Assert.Single(directors);
|
||||
Assert.Equal("Zack Snyder", directors[0].Name);
|
||||
|
||||
var actors = result.People.Where(x => x.Type == PersonType.Actor).ToArray();
|
||||
var actors = result.People.Where(x => x.Type == PersonKind.Actor).ToArray();
|
||||
Assert.Equal(15, actors.Length);
|
||||
|
||||
// Only test one actor
|
||||
@@ -138,7 +139,7 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers
|
||||
Assert.Equal(5, aquaman!.SortOrder);
|
||||
Assert.Equal("https://m.media-amazon.com/images/M/MV5BMTI5MTU5NjM1MV5BMl5BanBnXkFtZTcwODc4MDk0Mw@@._V1_SX1024_SY1024_.jpg", aquaman!.ImageUrl);
|
||||
|
||||
var lyricist = result.People.FirstOrDefault(x => x.Type == PersonType.Lyricist);
|
||||
var lyricist = result.People.FirstOrDefault(x => x.Type == PersonKind.Lyricist);
|
||||
Assert.NotNull(lyricist);
|
||||
Assert.Equal("Test Lyricist", lyricist!.Name);
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using Jellyfin.Data.Enums;
|
||||
using MediaBrowser.Common.Configuration;
|
||||
using MediaBrowser.Controller.Entities.TV;
|
||||
using MediaBrowser.Controller.Library;
|
||||
@@ -60,7 +61,7 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers
|
||||
|
||||
Assert.Equal(10, result.People.Count);
|
||||
|
||||
Assert.True(result.People.All(x => x.Type == PersonType.Actor));
|
||||
Assert.True(result.People.All(x => x.Type == PersonKind.Actor));
|
||||
|
||||
// Only test one actor
|
||||
var nini = result.People.FirstOrDefault(x => x.Role.Equals("Nini", StringComparison.Ordinal));
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using Jellyfin.Data.Enums;
|
||||
using MediaBrowser.Common.Configuration;
|
||||
using MediaBrowser.Controller.Entities.TV;
|
||||
using MediaBrowser.Controller.Library;
|
||||
@@ -67,7 +68,7 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers
|
||||
|
||||
Assert.Equal(6, result.People.Count);
|
||||
|
||||
Assert.True(result.People.All(x => x.Type == PersonType.Actor));
|
||||
Assert.True(result.People.All(x => x.Type == PersonKind.Actor));
|
||||
|
||||
// Only test one actor
|
||||
var sweeney = result.People.FirstOrDefault(x => x.Role.Equals("Mad Sweeney", StringComparison.Ordinal));
|
||||
@@ -89,7 +90,7 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers
|
||||
};
|
||||
|
||||
_parser.Fetch(result, path, CancellationToken.None);
|
||||
var item = (Series)result.Item;
|
||||
var item = result.Item;
|
||||
|
||||
Assert.Equal(id, item.ProviderIds[provider]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user