Compare commits
38 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e93d03d8cb | |||
| a656799dc8 | |||
| 83d2c69516 | |||
| 204fdeb035 | |||
| c4cdcb73fc | |||
| 1e0bd32358 | |||
| bf5f00a383 | |||
| 0430ffecb6 | |||
| 85cfd080f1 | |||
| a173d01139 | |||
| 3e7fad55de | |||
| 8cd685a4e9 | |||
| 9d565bbb83 | |||
| ab855af95e | |||
| 0bac1eab98 | |||
| 97c2ba0115 | |||
| 4df1003029 | |||
| 3269ce56ca | |||
| ce8eddd484 | |||
| 5e2872509a | |||
| d3f4dcf6f6 | |||
| be5e10ac37 | |||
| b85a0288a7 | |||
| f8fd851961 | |||
| 757f88b1a2 | |||
| fa732bf4a1 | |||
| 4f6edd9c3c | |||
| 768497d0ff | |||
| f1dc7d3a66 | |||
| a732a28229 | |||
| 17626b8e48 | |||
| 98c6c34fbb | |||
| bec8d7b3f5 | |||
| 2acae258b8 | |||
| 643df48707 | |||
| 2b98ce052e | |||
| 702347df50 | |||
| 9e5aa3e87e |
@@ -161,6 +161,7 @@
|
|||||||
- [MinecraftPlaye](https://github.com/MinecraftPlaye)
|
- [MinecraftPlaye](https://github.com/MinecraftPlaye)
|
||||||
- [RealGreenDragon](https://github.com/RealGreenDragon)
|
- [RealGreenDragon](https://github.com/RealGreenDragon)
|
||||||
- [TheTyrius](https://github.com/TheTyrius)
|
- [TheTyrius](https://github.com/TheTyrius)
|
||||||
|
- [Çağrı Sakaoğlu](https://github.com/ilovepilav)
|
||||||
|
|
||||||
# Emby Contributors
|
# Emby Contributors
|
||||||
|
|
||||||
@@ -229,3 +230,6 @@
|
|||||||
- [gnuyent](https://github.com/gnuyent)
|
- [gnuyent](https://github.com/gnuyent)
|
||||||
- [Matthew Jones](https://github.com/matthew-jones-uk)
|
- [Matthew Jones](https://github.com/matthew-jones-uk)
|
||||||
- [Jakob Kukla](https://github.com/jakobkukla)
|
- [Jakob Kukla](https://github.com/jakobkukla)
|
||||||
|
- [Utku Özdemir](https://github.com/utkuozdemir)
|
||||||
|
- [JPUC1143](https://github.com/Jpuc1143/)
|
||||||
|
- [0x25CBFC4F](https://github.com/0x25CBFC4F)
|
||||||
|
|||||||
@@ -250,7 +250,6 @@ namespace Emby.Naming.Common
|
|||||||
".sfx",
|
".sfx",
|
||||||
".shn",
|
".shn",
|
||||||
".sid",
|
".sid",
|
||||||
".spc",
|
|
||||||
".stm",
|
".stm",
|
||||||
".strm",
|
".strm",
|
||||||
".ult",
|
".ult",
|
||||||
|
|||||||
@@ -36,7 +36,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Authors>Jellyfin Contributors</Authors>
|
<Authors>Jellyfin Contributors</Authors>
|
||||||
<PackageId>Jellyfin.Naming</PackageId>
|
<PackageId>Jellyfin.Naming</PackageId>
|
||||||
<VersionPrefix>10.8.10</VersionPrefix>
|
<VersionPrefix>10.8.13</VersionPrefix>
|
||||||
<RepositoryUrl>https://github.com/jellyfin/jellyfin</RepositoryUrl>
|
<RepositoryUrl>https://github.com/jellyfin/jellyfin</RepositoryUrl>
|
||||||
<PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
|
<PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|||||||
@@ -183,6 +183,12 @@ namespace Emby.Server.Implementations.Library.Resolvers.TV
|
|||||||
private static void SetProviderIdFromPath(Series item, string path)
|
private static void SetProviderIdFromPath(Series item, string path)
|
||||||
{
|
{
|
||||||
var justName = Path.GetFileName(path.AsSpan());
|
var justName = Path.GetFileName(path.AsSpan());
|
||||||
|
|
||||||
|
var imdbId = justName.GetAttributeValue("imdbid");
|
||||||
|
if (!string.IsNullOrEmpty(imdbId))
|
||||||
|
{
|
||||||
|
item.SetProviderId(MetadataProvider.Imdb, imdbId);
|
||||||
|
}
|
||||||
|
|
||||||
var tvdbId = justName.GetAttributeValue("tvdbid");
|
var tvdbId = justName.GetAttributeValue("tvdbid");
|
||||||
if (!string.IsNullOrEmpty(tvdbId))
|
if (!string.IsNullOrEmpty(tvdbId))
|
||||||
|
|||||||
@@ -324,9 +324,15 @@ namespace Emby.Server.Implementations.Updates
|
|||||||
}
|
}
|
||||||
|
|
||||||
_completedInstallationsInternal.Add(package);
|
_completedInstallationsInternal.Add(package);
|
||||||
await _eventManager.PublishAsync(isUpdate
|
|
||||||
? (GenericEventArgs<InstallationInfo>)new PluginUpdatedEventArgs(package)
|
if (isUpdate)
|
||||||
: new PluginInstalledEventArgs(package)).ConfigureAwait(false);
|
{
|
||||||
|
await _eventManager.PublishAsync(new PluginUpdatedEventArgs(package)).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await _eventManager.PublishAsync(new PluginInstalledEventArgs(package)).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
|
||||||
_applicationHost.NotifyPendingRestart();
|
_applicationHost.NotifyPendingRestart();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -91,18 +91,18 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[ProducesAudioFile]
|
[ProducesAudioFile]
|
||||||
public async Task<ActionResult> GetAudioStream(
|
public async Task<ActionResult> GetAudioStream(
|
||||||
[FromRoute, Required] Guid itemId,
|
[FromRoute, Required] Guid itemId,
|
||||||
[FromQuery] string? container,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? container,
|
||||||
[FromQuery] bool? @static,
|
[FromQuery] bool? @static,
|
||||||
[FromQuery] string? @params,
|
[FromQuery] string? @params,
|
||||||
[FromQuery] string? tag,
|
[FromQuery] string? tag,
|
||||||
[FromQuery] string? deviceProfileId,
|
[FromQuery] string? deviceProfileId,
|
||||||
[FromQuery] string? playSessionId,
|
[FromQuery] string? playSessionId,
|
||||||
[FromQuery] string? segmentContainer,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? segmentContainer,
|
||||||
[FromQuery] int? segmentLength,
|
[FromQuery] int? segmentLength,
|
||||||
[FromQuery] int? minSegments,
|
[FromQuery] int? minSegments,
|
||||||
[FromQuery] string? mediaSourceId,
|
[FromQuery] string? mediaSourceId,
|
||||||
[FromQuery] string? deviceId,
|
[FromQuery] string? deviceId,
|
||||||
[FromQuery] string? audioCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? audioCodec,
|
||||||
[FromQuery] bool? enableAutoStreamCopy,
|
[FromQuery] bool? enableAutoStreamCopy,
|
||||||
[FromQuery] bool? allowVideoStreamCopy,
|
[FromQuery] bool? allowVideoStreamCopy,
|
||||||
[FromQuery] bool? allowAudioStreamCopy,
|
[FromQuery] bool? allowAudioStreamCopy,
|
||||||
@@ -132,8 +132,8 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[FromQuery] int? cpuCoreLimit,
|
[FromQuery] int? cpuCoreLimit,
|
||||||
[FromQuery] string? liveStreamId,
|
[FromQuery] string? liveStreamId,
|
||||||
[FromQuery] bool? enableMpegtsM2TsMode,
|
[FromQuery] bool? enableMpegtsM2TsMode,
|
||||||
[FromQuery] string? videoCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? videoCodec,
|
||||||
[FromQuery] string? subtitleCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? subtitleCodec,
|
||||||
[FromQuery] string? transcodeReasons,
|
[FromQuery] string? transcodeReasons,
|
||||||
[FromQuery] int? audioStreamIndex,
|
[FromQuery] int? audioStreamIndex,
|
||||||
[FromQuery] int? videoStreamIndex,
|
[FromQuery] int? videoStreamIndex,
|
||||||
@@ -262,12 +262,12 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[FromQuery] string? tag,
|
[FromQuery] string? tag,
|
||||||
[FromQuery] string? deviceProfileId,
|
[FromQuery] string? deviceProfileId,
|
||||||
[FromQuery] string? playSessionId,
|
[FromQuery] string? playSessionId,
|
||||||
[FromQuery] string? segmentContainer,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? segmentContainer,
|
||||||
[FromQuery] int? segmentLength,
|
[FromQuery] int? segmentLength,
|
||||||
[FromQuery] int? minSegments,
|
[FromQuery] int? minSegments,
|
||||||
[FromQuery] string? mediaSourceId,
|
[FromQuery] string? mediaSourceId,
|
||||||
[FromQuery] string? deviceId,
|
[FromQuery] string? deviceId,
|
||||||
[FromQuery] string? audioCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? audioCodec,
|
||||||
[FromQuery] bool? enableAutoStreamCopy,
|
[FromQuery] bool? enableAutoStreamCopy,
|
||||||
[FromQuery] bool? allowVideoStreamCopy,
|
[FromQuery] bool? allowVideoStreamCopy,
|
||||||
[FromQuery] bool? allowAudioStreamCopy,
|
[FromQuery] bool? allowAudioStreamCopy,
|
||||||
@@ -297,8 +297,8 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[FromQuery] int? cpuCoreLimit,
|
[FromQuery] int? cpuCoreLimit,
|
||||||
[FromQuery] string? liveStreamId,
|
[FromQuery] string? liveStreamId,
|
||||||
[FromQuery] bool? enableMpegtsM2TsMode,
|
[FromQuery] bool? enableMpegtsM2TsMode,
|
||||||
[FromQuery] string? videoCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? videoCodec,
|
||||||
[FromQuery] string? subtitleCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? subtitleCodec,
|
||||||
[FromQuery] string? transcodeReasons,
|
[FromQuery] string? transcodeReasons,
|
||||||
[FromQuery] int? audioStreamIndex,
|
[FromQuery] int? audioStreamIndex,
|
||||||
[FromQuery] int? videoStreamIndex,
|
[FromQuery] int? videoStreamIndex,
|
||||||
|
|||||||
@@ -125,12 +125,14 @@ namespace Jellyfin.Api.Controllers
|
|||||||
/// <param name="mediaEncoderPath">Media encoder path form body.</param>
|
/// <param name="mediaEncoderPath">Media encoder path form body.</param>
|
||||||
/// <response code="204">Media encoder path updated.</response>
|
/// <response code="204">Media encoder path updated.</response>
|
||||||
/// <returns>Status.</returns>
|
/// <returns>Status.</returns>
|
||||||
|
[Obsolete("This endpoint is obsolete.")]
|
||||||
[HttpPost("MediaEncoder/Path")]
|
[HttpPost("MediaEncoder/Path")]
|
||||||
[Authorize(Policy = Policies.FirstTimeSetupOrElevated)]
|
[Authorize(Policy = Policies.FirstTimeSetupOrElevated)]
|
||||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||||
public ActionResult UpdateMediaEncoderPath([FromBody, Required] MediaEncoderPathDto mediaEncoderPath)
|
public ActionResult UpdateMediaEncoderPath([FromBody, Required] MediaEncoderPathDto mediaEncoderPath)
|
||||||
{
|
{
|
||||||
_mediaEncoder.UpdateEncoderPath(mediaEncoderPath.Path, mediaEncoderPath.PathType);
|
// API ENDPOINT DISABLED (NOOP) FOR SECURITY PURPOSES
|
||||||
|
//_mediaEncoder.UpdateEncoderPath(mediaEncoderPath.Path, mediaEncoderPath.PathType);
|
||||||
return NoContent();
|
return NoContent();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -174,18 +174,18 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[ProducesPlaylistFile]
|
[ProducesPlaylistFile]
|
||||||
public async Task<ActionResult> GetLiveHlsStream(
|
public async Task<ActionResult> GetLiveHlsStream(
|
||||||
[FromRoute, Required] Guid itemId,
|
[FromRoute, Required] Guid itemId,
|
||||||
[FromQuery] string? container,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? container,
|
||||||
[FromQuery] bool? @static,
|
[FromQuery] bool? @static,
|
||||||
[FromQuery] string? @params,
|
[FromQuery] string? @params,
|
||||||
[FromQuery] string? tag,
|
[FromQuery] string? tag,
|
||||||
[FromQuery] string? deviceProfileId,
|
[FromQuery] string? deviceProfileId,
|
||||||
[FromQuery] string? playSessionId,
|
[FromQuery] string? playSessionId,
|
||||||
[FromQuery] string? segmentContainer,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? segmentContainer,
|
||||||
[FromQuery] int? segmentLength,
|
[FromQuery] int? segmentLength,
|
||||||
[FromQuery] int? minSegments,
|
[FromQuery] int? minSegments,
|
||||||
[FromQuery] string? mediaSourceId,
|
[FromQuery] string? mediaSourceId,
|
||||||
[FromQuery] string? deviceId,
|
[FromQuery] string? deviceId,
|
||||||
[FromQuery] string? audioCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? audioCodec,
|
||||||
[FromQuery] bool? enableAutoStreamCopy,
|
[FromQuery] bool? enableAutoStreamCopy,
|
||||||
[FromQuery] bool? allowVideoStreamCopy,
|
[FromQuery] bool? allowVideoStreamCopy,
|
||||||
[FromQuery] bool? allowAudioStreamCopy,
|
[FromQuery] bool? allowAudioStreamCopy,
|
||||||
@@ -215,8 +215,8 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[FromQuery] int? cpuCoreLimit,
|
[FromQuery] int? cpuCoreLimit,
|
||||||
[FromQuery] string? liveStreamId,
|
[FromQuery] string? liveStreamId,
|
||||||
[FromQuery] bool? enableMpegtsM2TsMode,
|
[FromQuery] bool? enableMpegtsM2TsMode,
|
||||||
[FromQuery] string? videoCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? videoCodec,
|
||||||
[FromQuery] string? subtitleCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? subtitleCodec,
|
||||||
[FromQuery] string? transcodeReasons,
|
[FromQuery] string? transcodeReasons,
|
||||||
[FromQuery] int? audioStreamIndex,
|
[FromQuery] int? audioStreamIndex,
|
||||||
[FromQuery] int? videoStreamIndex,
|
[FromQuery] int? videoStreamIndex,
|
||||||
@@ -426,12 +426,12 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[FromQuery] string? tag,
|
[FromQuery] string? tag,
|
||||||
[FromQuery] string? deviceProfileId,
|
[FromQuery] string? deviceProfileId,
|
||||||
[FromQuery] string? playSessionId,
|
[FromQuery] string? playSessionId,
|
||||||
[FromQuery] string? segmentContainer,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? segmentContainer,
|
||||||
[FromQuery] int? segmentLength,
|
[FromQuery] int? segmentLength,
|
||||||
[FromQuery] int? minSegments,
|
[FromQuery] int? minSegments,
|
||||||
[FromQuery, Required] string mediaSourceId,
|
[FromQuery, Required] string mediaSourceId,
|
||||||
[FromQuery] string? deviceId,
|
[FromQuery] string? deviceId,
|
||||||
[FromQuery] string? audioCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? audioCodec,
|
||||||
[FromQuery] bool? enableAutoStreamCopy,
|
[FromQuery] bool? enableAutoStreamCopy,
|
||||||
[FromQuery] bool? allowVideoStreamCopy,
|
[FromQuery] bool? allowVideoStreamCopy,
|
||||||
[FromQuery] bool? allowAudioStreamCopy,
|
[FromQuery] bool? allowAudioStreamCopy,
|
||||||
@@ -463,8 +463,8 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[FromQuery] int? cpuCoreLimit,
|
[FromQuery] int? cpuCoreLimit,
|
||||||
[FromQuery] string? liveStreamId,
|
[FromQuery] string? liveStreamId,
|
||||||
[FromQuery] bool? enableMpegtsM2TsMode,
|
[FromQuery] bool? enableMpegtsM2TsMode,
|
||||||
[FromQuery] string? videoCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? videoCodec,
|
||||||
[FromQuery] string? subtitleCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? subtitleCodec,
|
||||||
[FromQuery] string? transcodeReasons,
|
[FromQuery] string? transcodeReasons,
|
||||||
[FromQuery] int? audioStreamIndex,
|
[FromQuery] int? audioStreamIndex,
|
||||||
[FromQuery] int? videoStreamIndex,
|
[FromQuery] int? videoStreamIndex,
|
||||||
@@ -596,12 +596,12 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[FromQuery] string? tag,
|
[FromQuery] string? tag,
|
||||||
[FromQuery] string? deviceProfileId,
|
[FromQuery] string? deviceProfileId,
|
||||||
[FromQuery] string? playSessionId,
|
[FromQuery] string? playSessionId,
|
||||||
[FromQuery] string? segmentContainer,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? segmentContainer,
|
||||||
[FromQuery] int? segmentLength,
|
[FromQuery] int? segmentLength,
|
||||||
[FromQuery] int? minSegments,
|
[FromQuery] int? minSegments,
|
||||||
[FromQuery, Required] string mediaSourceId,
|
[FromQuery, Required] string mediaSourceId,
|
||||||
[FromQuery] string? deviceId,
|
[FromQuery] string? deviceId,
|
||||||
[FromQuery] string? audioCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? audioCodec,
|
||||||
[FromQuery] bool? enableAutoStreamCopy,
|
[FromQuery] bool? enableAutoStreamCopy,
|
||||||
[FromQuery] bool? allowVideoStreamCopy,
|
[FromQuery] bool? allowVideoStreamCopy,
|
||||||
[FromQuery] bool? allowAudioStreamCopy,
|
[FromQuery] bool? allowAudioStreamCopy,
|
||||||
@@ -632,8 +632,8 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[FromQuery] int? cpuCoreLimit,
|
[FromQuery] int? cpuCoreLimit,
|
||||||
[FromQuery] string? liveStreamId,
|
[FromQuery] string? liveStreamId,
|
||||||
[FromQuery] bool? enableMpegtsM2TsMode,
|
[FromQuery] bool? enableMpegtsM2TsMode,
|
||||||
[FromQuery] string? videoCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? videoCodec,
|
||||||
[FromQuery] string? subtitleCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? subtitleCodec,
|
||||||
[FromQuery] string? transcodeReasons,
|
[FromQuery] string? transcodeReasons,
|
||||||
[FromQuery] int? audioStreamIndex,
|
[FromQuery] int? audioStreamIndex,
|
||||||
[FromQuery] int? videoStreamIndex,
|
[FromQuery] int? videoStreamIndex,
|
||||||
@@ -762,12 +762,12 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[FromQuery] string? tag,
|
[FromQuery] string? tag,
|
||||||
[FromQuery] string? deviceProfileId,
|
[FromQuery] string? deviceProfileId,
|
||||||
[FromQuery] string? playSessionId,
|
[FromQuery] string? playSessionId,
|
||||||
[FromQuery] string? segmentContainer,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? segmentContainer,
|
||||||
[FromQuery] int? segmentLength,
|
[FromQuery] int? segmentLength,
|
||||||
[FromQuery] int? minSegments,
|
[FromQuery] int? minSegments,
|
||||||
[FromQuery] string? mediaSourceId,
|
[FromQuery] string? mediaSourceId,
|
||||||
[FromQuery] string? deviceId,
|
[FromQuery] string? deviceId,
|
||||||
[FromQuery] string? audioCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? audioCodec,
|
||||||
[FromQuery] bool? enableAutoStreamCopy,
|
[FromQuery] bool? enableAutoStreamCopy,
|
||||||
[FromQuery] bool? allowVideoStreamCopy,
|
[FromQuery] bool? allowVideoStreamCopy,
|
||||||
[FromQuery] bool? allowAudioStreamCopy,
|
[FromQuery] bool? allowAudioStreamCopy,
|
||||||
@@ -799,8 +799,8 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[FromQuery] int? cpuCoreLimit,
|
[FromQuery] int? cpuCoreLimit,
|
||||||
[FromQuery] string? liveStreamId,
|
[FromQuery] string? liveStreamId,
|
||||||
[FromQuery] bool? enableMpegtsM2TsMode,
|
[FromQuery] bool? enableMpegtsM2TsMode,
|
||||||
[FromQuery] string? videoCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? videoCodec,
|
||||||
[FromQuery] string? subtitleCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? subtitleCodec,
|
||||||
[FromQuery] string? transcodeReasons,
|
[FromQuery] string? transcodeReasons,
|
||||||
[FromQuery] int? audioStreamIndex,
|
[FromQuery] int? audioStreamIndex,
|
||||||
[FromQuery] int? videoStreamIndex,
|
[FromQuery] int? videoStreamIndex,
|
||||||
@@ -930,12 +930,12 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[FromQuery] string? tag,
|
[FromQuery] string? tag,
|
||||||
[FromQuery] string? deviceProfileId,
|
[FromQuery] string? deviceProfileId,
|
||||||
[FromQuery] string? playSessionId,
|
[FromQuery] string? playSessionId,
|
||||||
[FromQuery] string? segmentContainer,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? segmentContainer,
|
||||||
[FromQuery] int? segmentLength,
|
[FromQuery] int? segmentLength,
|
||||||
[FromQuery] int? minSegments,
|
[FromQuery] int? minSegments,
|
||||||
[FromQuery] string? mediaSourceId,
|
[FromQuery] string? mediaSourceId,
|
||||||
[FromQuery] string? deviceId,
|
[FromQuery] string? deviceId,
|
||||||
[FromQuery] string? audioCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? audioCodec,
|
||||||
[FromQuery] bool? enableAutoStreamCopy,
|
[FromQuery] bool? enableAutoStreamCopy,
|
||||||
[FromQuery] bool? allowVideoStreamCopy,
|
[FromQuery] bool? allowVideoStreamCopy,
|
||||||
[FromQuery] bool? allowAudioStreamCopy,
|
[FromQuery] bool? allowAudioStreamCopy,
|
||||||
@@ -966,8 +966,8 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[FromQuery] int? cpuCoreLimit,
|
[FromQuery] int? cpuCoreLimit,
|
||||||
[FromQuery] string? liveStreamId,
|
[FromQuery] string? liveStreamId,
|
||||||
[FromQuery] bool? enableMpegtsM2TsMode,
|
[FromQuery] bool? enableMpegtsM2TsMode,
|
||||||
[FromQuery] string? videoCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? videoCodec,
|
||||||
[FromQuery] string? subtitleCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? subtitleCodec,
|
||||||
[FromQuery] string? transcodeReasons,
|
[FromQuery] string? transcodeReasons,
|
||||||
[FromQuery] int? audioStreamIndex,
|
[FromQuery] int? audioStreamIndex,
|
||||||
[FromQuery] int? videoStreamIndex,
|
[FromQuery] int? videoStreamIndex,
|
||||||
@@ -1107,12 +1107,12 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[FromQuery] string? tag,
|
[FromQuery] string? tag,
|
||||||
[FromQuery] string? deviceProfileId,
|
[FromQuery] string? deviceProfileId,
|
||||||
[FromQuery] string? playSessionId,
|
[FromQuery] string? playSessionId,
|
||||||
[FromQuery] string? segmentContainer,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? segmentContainer,
|
||||||
[FromQuery] int? segmentLength,
|
[FromQuery] int? segmentLength,
|
||||||
[FromQuery] int? minSegments,
|
[FromQuery] int? minSegments,
|
||||||
[FromQuery] string? mediaSourceId,
|
[FromQuery] string? mediaSourceId,
|
||||||
[FromQuery] string? deviceId,
|
[FromQuery] string? deviceId,
|
||||||
[FromQuery] string? audioCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? audioCodec,
|
||||||
[FromQuery] bool? enableAutoStreamCopy,
|
[FromQuery] bool? enableAutoStreamCopy,
|
||||||
[FromQuery] bool? allowVideoStreamCopy,
|
[FromQuery] bool? allowVideoStreamCopy,
|
||||||
[FromQuery] bool? allowAudioStreamCopy,
|
[FromQuery] bool? allowAudioStreamCopy,
|
||||||
@@ -1144,8 +1144,8 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[FromQuery] int? cpuCoreLimit,
|
[FromQuery] int? cpuCoreLimit,
|
||||||
[FromQuery] string? liveStreamId,
|
[FromQuery] string? liveStreamId,
|
||||||
[FromQuery] bool? enableMpegtsM2TsMode,
|
[FromQuery] bool? enableMpegtsM2TsMode,
|
||||||
[FromQuery] string? videoCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? videoCodec,
|
||||||
[FromQuery] string? subtitleCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? subtitleCodec,
|
||||||
[FromQuery] string? transcodeReasons,
|
[FromQuery] string? transcodeReasons,
|
||||||
[FromQuery] int? audioStreamIndex,
|
[FromQuery] int? audioStreamIndex,
|
||||||
[FromQuery] int? videoStreamIndex,
|
[FromQuery] int? videoStreamIndex,
|
||||||
@@ -1288,12 +1288,12 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[FromQuery] string? tag,
|
[FromQuery] string? tag,
|
||||||
[FromQuery] string? deviceProfileId,
|
[FromQuery] string? deviceProfileId,
|
||||||
[FromQuery] string? playSessionId,
|
[FromQuery] string? playSessionId,
|
||||||
[FromQuery] string? segmentContainer,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? segmentContainer,
|
||||||
[FromQuery] int? segmentLength,
|
[FromQuery] int? segmentLength,
|
||||||
[FromQuery] int? minSegments,
|
[FromQuery] int? minSegments,
|
||||||
[FromQuery] string? mediaSourceId,
|
[FromQuery] string? mediaSourceId,
|
||||||
[FromQuery] string? deviceId,
|
[FromQuery] string? deviceId,
|
||||||
[FromQuery] string? audioCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? audioCodec,
|
||||||
[FromQuery] bool? enableAutoStreamCopy,
|
[FromQuery] bool? enableAutoStreamCopy,
|
||||||
[FromQuery] bool? allowVideoStreamCopy,
|
[FromQuery] bool? allowVideoStreamCopy,
|
||||||
[FromQuery] bool? allowAudioStreamCopy,
|
[FromQuery] bool? allowAudioStreamCopy,
|
||||||
@@ -1324,8 +1324,8 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[FromQuery] int? cpuCoreLimit,
|
[FromQuery] int? cpuCoreLimit,
|
||||||
[FromQuery] string? liveStreamId,
|
[FromQuery] string? liveStreamId,
|
||||||
[FromQuery] bool? enableMpegtsM2TsMode,
|
[FromQuery] bool? enableMpegtsM2TsMode,
|
||||||
[FromQuery] string? videoCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? videoCodec,
|
||||||
[FromQuery] string? subtitleCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? subtitleCodec,
|
||||||
[FromQuery] string? transcodeReasons,
|
[FromQuery] string? transcodeReasons,
|
||||||
[FromQuery] int? audioStreamIndex,
|
[FromQuery] int? audioStreamIndex,
|
||||||
[FromQuery] int? videoStreamIndex,
|
[FromQuery] int? videoStreamIndex,
|
||||||
|
|||||||
@@ -102,13 +102,13 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[FromQuery] string? mediaSourceId,
|
[FromQuery] string? mediaSourceId,
|
||||||
[FromQuery] string? deviceId,
|
[FromQuery] string? deviceId,
|
||||||
[FromQuery] Guid? userId,
|
[FromQuery] Guid? userId,
|
||||||
[FromQuery] string? audioCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? audioCodec,
|
||||||
[FromQuery] int? maxAudioChannels,
|
[FromQuery] int? maxAudioChannels,
|
||||||
[FromQuery] int? transcodingAudioChannels,
|
[FromQuery] int? transcodingAudioChannels,
|
||||||
[FromQuery] int? maxStreamingBitrate,
|
[FromQuery] int? maxStreamingBitrate,
|
||||||
[FromQuery] int? audioBitRate,
|
[FromQuery] int? audioBitRate,
|
||||||
[FromQuery] long? startTimeTicks,
|
[FromQuery] long? startTimeTicks,
|
||||||
[FromQuery] string? transcodingContainer,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? transcodingContainer,
|
||||||
[FromQuery] string? transcodingProtocol,
|
[FromQuery] string? transcodingProtocol,
|
||||||
[FromQuery] int? maxAudioSampleRate,
|
[FromQuery] int? maxAudioSampleRate,
|
||||||
[FromQuery] int? maxAudioBitDepth,
|
[FromQuery] int? maxAudioBitDepth,
|
||||||
|
|||||||
@@ -318,18 +318,18 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[ProducesVideoFile]
|
[ProducesVideoFile]
|
||||||
public async Task<ActionResult> GetVideoStream(
|
public async Task<ActionResult> GetVideoStream(
|
||||||
[FromRoute, Required] Guid itemId,
|
[FromRoute, Required] Guid itemId,
|
||||||
[FromQuery] string? container,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? container,
|
||||||
[FromQuery] bool? @static,
|
[FromQuery] bool? @static,
|
||||||
[FromQuery] string? @params,
|
[FromQuery] string? @params,
|
||||||
[FromQuery] string? tag,
|
[FromQuery] string? tag,
|
||||||
[FromQuery] string? deviceProfileId,
|
[FromQuery] string? deviceProfileId,
|
||||||
[FromQuery] string? playSessionId,
|
[FromQuery] string? playSessionId,
|
||||||
[FromQuery] string? segmentContainer,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? segmentContainer,
|
||||||
[FromQuery] int? segmentLength,
|
[FromQuery] int? segmentLength,
|
||||||
[FromQuery] int? minSegments,
|
[FromQuery] int? minSegments,
|
||||||
[FromQuery] string? mediaSourceId,
|
[FromQuery] string? mediaSourceId,
|
||||||
[FromQuery] string? deviceId,
|
[FromQuery] string? deviceId,
|
||||||
[FromQuery] string? audioCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? audioCodec,
|
||||||
[FromQuery] bool? enableAutoStreamCopy,
|
[FromQuery] bool? enableAutoStreamCopy,
|
||||||
[FromQuery] bool? allowVideoStreamCopy,
|
[FromQuery] bool? allowVideoStreamCopy,
|
||||||
[FromQuery] bool? allowAudioStreamCopy,
|
[FromQuery] bool? allowAudioStreamCopy,
|
||||||
@@ -361,8 +361,8 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[FromQuery] int? cpuCoreLimit,
|
[FromQuery] int? cpuCoreLimit,
|
||||||
[FromQuery] string? liveStreamId,
|
[FromQuery] string? liveStreamId,
|
||||||
[FromQuery] bool? enableMpegtsM2TsMode,
|
[FromQuery] bool? enableMpegtsM2TsMode,
|
||||||
[FromQuery] string? videoCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? videoCodec,
|
||||||
[FromQuery] string? subtitleCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? subtitleCodec,
|
||||||
[FromQuery] string? transcodeReasons,
|
[FromQuery] string? transcodeReasons,
|
||||||
[FromQuery] int? audioStreamIndex,
|
[FromQuery] int? audioStreamIndex,
|
||||||
[FromQuery] int? videoStreamIndex,
|
[FromQuery] int? videoStreamIndex,
|
||||||
@@ -578,12 +578,12 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[FromQuery] string? tag,
|
[FromQuery] string? tag,
|
||||||
[FromQuery] string? deviceProfileId,
|
[FromQuery] string? deviceProfileId,
|
||||||
[FromQuery] string? playSessionId,
|
[FromQuery] string? playSessionId,
|
||||||
[FromQuery] string? segmentContainer,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? segmentContainer,
|
||||||
[FromQuery] int? segmentLength,
|
[FromQuery] int? segmentLength,
|
||||||
[FromQuery] int? minSegments,
|
[FromQuery] int? minSegments,
|
||||||
[FromQuery] string? mediaSourceId,
|
[FromQuery] string? mediaSourceId,
|
||||||
[FromQuery] string? deviceId,
|
[FromQuery] string? deviceId,
|
||||||
[FromQuery] string? audioCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? audioCodec,
|
||||||
[FromQuery] bool? enableAutoStreamCopy,
|
[FromQuery] bool? enableAutoStreamCopy,
|
||||||
[FromQuery] bool? allowVideoStreamCopy,
|
[FromQuery] bool? allowVideoStreamCopy,
|
||||||
[FromQuery] bool? allowAudioStreamCopy,
|
[FromQuery] bool? allowAudioStreamCopy,
|
||||||
@@ -615,8 +615,8 @@ namespace Jellyfin.Api.Controllers
|
|||||||
[FromQuery] int? cpuCoreLimit,
|
[FromQuery] int? cpuCoreLimit,
|
||||||
[FromQuery] string? liveStreamId,
|
[FromQuery] string? liveStreamId,
|
||||||
[FromQuery] bool? enableMpegtsM2TsMode,
|
[FromQuery] bool? enableMpegtsM2TsMode,
|
||||||
[FromQuery] string? videoCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? videoCodec,
|
||||||
[FromQuery] string? subtitleCodec,
|
[FromQuery][RegularExpression(EncodingHelper.ValidationRegex)] string? subtitleCodec,
|
||||||
[FromQuery] string? transcodeReasons,
|
[FromQuery] string? transcodeReasons,
|
||||||
[FromQuery] int? audioStreamIndex,
|
[FromQuery] int? audioStreamIndex,
|
||||||
[FromQuery] int? videoStreamIndex,
|
[FromQuery] int? videoStreamIndex,
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Authors>Jellyfin Contributors</Authors>
|
<Authors>Jellyfin Contributors</Authors>
|
||||||
<PackageId>Jellyfin.Data</PackageId>
|
<PackageId>Jellyfin.Data</PackageId>
|
||||||
<VersionPrefix>10.8.10</VersionPrefix>
|
<VersionPrefix>10.8.13</VersionPrefix>
|
||||||
<RepositoryUrl>https://github.com/jellyfin/jellyfin</RepositoryUrl>
|
<RepositoryUrl>https://github.com/jellyfin/jellyfin</RepositoryUrl>
|
||||||
<PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
|
<PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Authors>Jellyfin Contributors</Authors>
|
<Authors>Jellyfin Contributors</Authors>
|
||||||
<PackageId>Jellyfin.Common</PackageId>
|
<PackageId>Jellyfin.Common</PackageId>
|
||||||
<VersionPrefix>10.8.10</VersionPrefix>
|
<VersionPrefix>10.8.13</VersionPrefix>
|
||||||
<RepositoryUrl>https://github.com/jellyfin/jellyfin</RepositoryUrl>
|
<RepositoryUrl>https://github.com/jellyfin/jellyfin</RepositoryUrl>
|
||||||
<PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
|
<PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|||||||
@@ -170,6 +170,11 @@ namespace MediaBrowser.Common.Net
|
|||||||
address = address.MapToIPv4();
|
address = address.MapToIPv4();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (address.AddressFamily != AddressFamily)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
var (altAddress, altPrefix) = NetworkAddressOf(address, PrefixLength);
|
var (altAddress, altPrefix) = NetworkAddressOf(address, PrefixLength);
|
||||||
return NetworkAddress.Address.Equals(altAddress) && NetworkAddress.PrefixLength >= altPrefix;
|
return NetworkAddress.Address.Equals(altAddress) && NetworkAddress.PrefixLength >= altPrefix;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ namespace MediaBrowser.Controller.Entities
|
|||||||
/// The supported image extensions.
|
/// The supported image extensions.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static readonly string[] SupportedImageExtensions
|
public static readonly string[] SupportedImageExtensions
|
||||||
= new[] { ".png", ".jpg", ".jpeg", ".tbn", ".gif" };
|
= new[] { ".png", ".jpg", ".jpeg", ".webp", ".tbn", ".gif" };
|
||||||
|
|
||||||
private static readonly List<string> _supportedExtensions = new List<string>(SupportedImageExtensions)
|
private static readonly List<string> _supportedExtensions = new List<string>(SupportedImageExtensions)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Authors>Jellyfin Contributors</Authors>
|
<Authors>Jellyfin Contributors</Authors>
|
||||||
<PackageId>Jellyfin.Controller</PackageId>
|
<PackageId>Jellyfin.Controller</PackageId>
|
||||||
<VersionPrefix>10.8.10</VersionPrefix>
|
<VersionPrefix>10.8.13</VersionPrefix>
|
||||||
<RepositoryUrl>https://github.com/jellyfin/jellyfin</RepositoryUrl>
|
<RepositoryUrl>https://github.com/jellyfin/jellyfin</RepositoryUrl>
|
||||||
<PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
|
<PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|||||||
@@ -25,6 +25,11 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
{
|
{
|
||||||
public class EncodingHelper
|
public class EncodingHelper
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The codec validation regex.
|
||||||
|
/// </summary>
|
||||||
|
public const string ValidationRegex = @"^[a-zA-Z0-9\-\._,|]{0,40}$";
|
||||||
|
|
||||||
private const string QsvAlias = "qs";
|
private const string QsvAlias = "qs";
|
||||||
private const string VaapiAlias = "va";
|
private const string VaapiAlias = "va";
|
||||||
private const string D3d11vaAlias = "dx11";
|
private const string D3d11vaAlias = "dx11";
|
||||||
@@ -36,6 +41,8 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
private readonly ISubtitleEncoder _subtitleEncoder;
|
private readonly ISubtitleEncoder _subtitleEncoder;
|
||||||
private readonly IConfiguration _config;
|
private readonly IConfiguration _config;
|
||||||
|
|
||||||
|
private static readonly Regex _validationRegex = new(ValidationRegex, RegexOptions.Compiled);
|
||||||
|
|
||||||
// i915 hang was fixed by linux 6.2 (3f882f2)
|
// i915 hang was fixed by linux 6.2 (3f882f2)
|
||||||
private readonly Version _minKerneli915Hang = new Version(5, 18);
|
private readonly Version _minKerneli915Hang = new Version(5, 18);
|
||||||
private readonly Version _maxKerneli915Hang = new Version(6, 1, 3);
|
private readonly Version _maxKerneli915Hang = new Version(6, 1, 3);
|
||||||
@@ -253,7 +260,10 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
return "libtheora";
|
return "libtheora";
|
||||||
}
|
}
|
||||||
|
|
||||||
return codec.ToLowerInvariant();
|
if (_validationRegex.IsMatch(codec))
|
||||||
|
{
|
||||||
|
return codec.ToLowerInvariant();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return "copy";
|
return "copy";
|
||||||
@@ -276,7 +286,7 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
|
|
||||||
public static string GetInputFormat(string container)
|
public static string GetInputFormat(string container)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(container))
|
if (string.IsNullOrEmpty(container) || !_validationRegex.IsMatch(container))
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -523,6 +533,11 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
{
|
{
|
||||||
var codec = state.OutputAudioCodec;
|
var codec = state.OutputAudioCodec;
|
||||||
|
|
||||||
|
if (!_validationRegex.IsMatch(codec))
|
||||||
|
{
|
||||||
|
codec = "aac";
|
||||||
|
}
|
||||||
|
|
||||||
if (string.Equals(codec, "aac", StringComparison.OrdinalIgnoreCase))
|
if (string.Equals(codec, "aac", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
// Use libfdk_aac for better audio quality if using custom build of FFmpeg which has fdk_aac support
|
// Use libfdk_aac for better audio quality if using custom build of FFmpeg which has fdk_aac support
|
||||||
@@ -627,14 +642,20 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
private string GetVaapiDeviceArgs(string renderNodePath, string driver, string kernelDriver, string alias)
|
private string GetVaapiDeviceArgs(string renderNodePath, string driver, string kernelDriver, string alias)
|
||||||
{
|
{
|
||||||
alias ??= VaapiAlias;
|
alias ??= VaapiAlias;
|
||||||
renderNodePath = renderNodePath ?? "/dev/dri/renderD128";
|
|
||||||
var options = string.IsNullOrEmpty(driver)
|
// 'renderNodePath' has higher priority than 'kernelDriver'
|
||||||
? renderNodePath
|
var driverOpts = string.IsNullOrEmpty(renderNodePath)
|
||||||
: ",driver=" + driver + (string.IsNullOrEmpty(kernelDriver) ? string.Empty : ",kernel_driver=" + kernelDriver);
|
? (string.IsNullOrEmpty(kernelDriver) ? string.Empty : ",kernel_driver=" + kernelDriver)
|
||||||
|
: renderNodePath;
|
||||||
|
|
||||||
|
// 'driver' behaves similarly to env LIBVA_DRIVER_NAME
|
||||||
|
driverOpts += string.IsNullOrEmpty(driver) ? string.Empty : ",driver=" + driver;
|
||||||
|
|
||||||
|
var options = string.IsNullOrEmpty(driverOpts) ? string.Empty : ":" + driverOpts;
|
||||||
|
|
||||||
return string.Format(
|
return string.Format(
|
||||||
CultureInfo.InvariantCulture,
|
CultureInfo.InvariantCulture,
|
||||||
" -init_hw_device vaapi={0}:{1}",
|
" -init_hw_device vaapi={0}{1}",
|
||||||
alias,
|
alias,
|
||||||
options);
|
options);
|
||||||
}
|
}
|
||||||
@@ -739,14 +760,14 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
|
|
||||||
if (_mediaEncoder.IsVaapiDeviceInteliHD)
|
if (_mediaEncoder.IsVaapiDeviceInteliHD)
|
||||||
{
|
{
|
||||||
args.Append(GetVaapiDeviceArgs(null, "iHD", null, VaapiAlias));
|
args.Append(GetVaapiDeviceArgs(options.VaapiDevice, "iHD", null, VaapiAlias));
|
||||||
}
|
}
|
||||||
else if (_mediaEncoder.IsVaapiDeviceInteli965)
|
else if (_mediaEncoder.IsVaapiDeviceInteli965)
|
||||||
{
|
{
|
||||||
// Only override i965 since it has lower priority than iHD in libva lookup.
|
// Only override i965 since it has lower priority than iHD in libva lookup.
|
||||||
Environment.SetEnvironmentVariable("LIBVA_DRIVER_NAME", "i965");
|
Environment.SetEnvironmentVariable("LIBVA_DRIVER_NAME", "i965");
|
||||||
Environment.SetEnvironmentVariable("LIBVA_DRIVER_NAME_JELLYFIN", "i965");
|
Environment.SetEnvironmentVariable("LIBVA_DRIVER_NAME_JELLYFIN", "i965");
|
||||||
args.Append(GetVaapiDeviceArgs(null, "i965", null, VaapiAlias));
|
args.Append(GetVaapiDeviceArgs(options.VaapiDevice, "i965", null, VaapiAlias));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1313,6 +1334,13 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
args += keyFrameArg + gopArg;
|
args += keyFrameArg + gopArg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// global_header produced by AMD VA-API encoder causes non-playable fMP4 on iOS
|
||||||
|
if (codec.Contains("vaapi", StringComparison.OrdinalIgnoreCase)
|
||||||
|
&& _mediaEncoder.IsVaapiDeviceAmd)
|
||||||
|
{
|
||||||
|
args += " -flags:v -global_header";
|
||||||
|
}
|
||||||
|
|
||||||
return args;
|
return args;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2063,7 +2091,7 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
var outputScaleFactor = GetVideoBitrateScaleFactor(outputVideoCodec);
|
var outputScaleFactor = GetVideoBitrateScaleFactor(outputVideoCodec);
|
||||||
|
|
||||||
// Don't scale the real bitrate lower than the requested bitrate
|
// Don't scale the real bitrate lower than the requested bitrate
|
||||||
var scaleFactor = Math.Min(outputScaleFactor / inputScaleFactor, 1);
|
var scaleFactor = Math.Max(outputScaleFactor / inputScaleFactor, 1);
|
||||||
|
|
||||||
if (bitrate <= 500000)
|
if (bitrate <= 500000)
|
||||||
{
|
{
|
||||||
@@ -3480,12 +3508,6 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
// map from d3d11va to qsv.
|
// map from d3d11va to qsv.
|
||||||
mainFilters.Add("hwmap=derive_device=qsv");
|
mainFilters.Add("hwmap=derive_device=qsv");
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
// Insert a qsv scaler to sync the decoder surface,
|
|
||||||
// msdk will passthrough this internally.
|
|
||||||
mainFilters.Add("hwmap=derive_device=qsv,scale_qsv");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// hw deint
|
// hw deint
|
||||||
@@ -4646,10 +4668,8 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
|
|
||||||
if (isD3d11Supported && isCodecAvailable)
|
if (isD3d11Supported && isCodecAvailable)
|
||||||
{
|
{
|
||||||
// set -threads 3 to intel d3d11va decoder explicitly. Lower threads may result in dead lock.
|
|
||||||
// on newer devices such as Xe, the larger the init_pool_size, the longer the initialization time for opencl to derive from d3d11.
|
|
||||||
return " -hwaccel d3d11va" + (outputHwSurface ? " -hwaccel_output_format d3d11" : string.Empty)
|
return " -hwaccel d3d11va" + (outputHwSurface ? " -hwaccel_output_format d3d11" : string.Empty)
|
||||||
+ (profileMismatch ? " -hwaccel_flags +allow_profile_mismatch" : string.Empty) + " -threads 3" + (isAv1 ? " -c:v av1" : string.Empty);
|
+ (profileMismatch ? " -hwaccel_flags +allow_profile_mismatch" : string.Empty) + " -threads 2" + (isAv1 ? " -c:v av1" : string.Empty);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -751,9 +751,11 @@ namespace MediaBrowser.MediaEncoding.Probing
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isAudio
|
if (isAudio
|
||||||
|| string.Equals(stream.Codec, "mjpeg", StringComparison.OrdinalIgnoreCase)
|
&& (string.Equals(stream.Codec, "bmp", StringComparison.OrdinalIgnoreCase)
|
||||||
|| string.Equals(stream.Codec, "gif", StringComparison.OrdinalIgnoreCase)
|
|| string.Equals(stream.Codec, "gif", StringComparison.OrdinalIgnoreCase)
|
||||||
|| string.Equals(stream.Codec, "png", StringComparison.OrdinalIgnoreCase))
|
|| string.Equals(stream.Codec, "mjpeg", StringComparison.OrdinalIgnoreCase)
|
||||||
|
|| string.Equals(stream.Codec, "png", StringComparison.OrdinalIgnoreCase)
|
||||||
|
|| string.Equals(stream.Codec, "webp", StringComparison.OrdinalIgnoreCase)))
|
||||||
{
|
{
|
||||||
stream.Type = MediaStreamType.EmbeddedImage;
|
stream.Type = MediaStreamType.EmbeddedImage;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -746,11 +746,10 @@ namespace MediaBrowser.Model.Dlna
|
|||||||
|
|
||||||
if (ContainerProfile.ContainsContainer(videoCodecs, item.VideoStream?.Codec))
|
if (ContainerProfile.ContainsContainer(videoCodecs, item.VideoStream?.Codec))
|
||||||
{
|
{
|
||||||
var videoCodec = transcodingProfile.VideoCodec;
|
var videoCodec = videoStream?.Codec;
|
||||||
var container = transcodingProfile.Container;
|
var container = transcodingProfile.Container;
|
||||||
var appliedVideoConditions = options.Profile.CodecProfiles
|
var appliedVideoConditions = options.Profile.CodecProfiles
|
||||||
.Where(i => i.Type == CodecType.Video &&
|
.Where(i => i.Type == CodecType.Video &&
|
||||||
(string.IsNullOrEmpty(i.Codec) || string.Equals(i.Codec, videoStream?.Codec, StringComparison.OrdinalIgnoreCase)) &&
|
|
||||||
i.ContainsAnyCodec(videoCodec, container) &&
|
i.ContainsAnyCodec(videoCodec, container) &&
|
||||||
i.ApplyConditions.All(applyCondition => ConditionProcessor.IsVideoConditionSatisfied(applyCondition, videoStream?.Width, videoStream?.Height, videoStream?.BitDepth, videoStream?.BitRate, videoStream?.Profile, videoStream?.VideoRangeType, videoStream?.Level, videoFramerate, videoStream?.PacketLength, timestamp, videoStream?.IsAnamorphic, videoStream?.IsInterlaced, videoStream?.RefFrames, numVideoStreams, numAudioStreams, videoStream?.CodecTag, videoStream?.IsAVC)))
|
i.ApplyConditions.All(applyCondition => ConditionProcessor.IsVideoConditionSatisfied(applyCondition, videoStream?.Width, videoStream?.Height, videoStream?.BitDepth, videoStream?.BitRate, videoStream?.Profile, videoStream?.VideoRangeType, videoStream?.Level, videoFramerate, videoStream?.PacketLength, timestamp, videoStream?.IsAnamorphic, videoStream?.IsInterlaced, videoStream?.RefFrames, numVideoStreams, numAudioStreams, videoStream?.CodecTag, videoStream?.IsAVC)))
|
||||||
.Select(i =>
|
.Select(i =>
|
||||||
@@ -875,8 +874,7 @@ namespace MediaBrowser.Model.Dlna
|
|||||||
|
|
||||||
var appliedVideoConditions = options.Profile.CodecProfiles
|
var appliedVideoConditions = options.Profile.CodecProfiles
|
||||||
.Where(i => i.Type == CodecType.Video &&
|
.Where(i => i.Type == CodecType.Video &&
|
||||||
(string.IsNullOrEmpty(i.Codec) || string.Equals(i.Codec, videoStream?.Codec, StringComparison.OrdinalIgnoreCase)) &&
|
i.ContainsAnyCodec(videoStream?.Codec, container) &&
|
||||||
i.ContainsAnyCodec(videoCodec, container) &&
|
|
||||||
i.ApplyConditions.All(applyCondition => ConditionProcessor.IsVideoConditionSatisfied(applyCondition, width, height, bitDepth, videoBitrate, videoProfile, videoRangeType, videoLevel, videoFramerate, packetLength, timestamp, isAnamorphic, isInterlaced, refFrames, numVideoStreams, numAudioStreams, videoCodecTag, isAvc)));
|
i.ApplyConditions.All(applyCondition => ConditionProcessor.IsVideoConditionSatisfied(applyCondition, width, height, bitDepth, videoBitrate, videoProfile, videoRangeType, videoLevel, videoFramerate, packetLength, timestamp, isAnamorphic, isInterlaced, refFrames, numVideoStreams, numAudioStreams, videoCodecTag, isAvc)));
|
||||||
var isFirstAppliedCodecProfile = true;
|
var isFirstAppliedCodecProfile = true;
|
||||||
foreach (var i in appliedVideoConditions)
|
foreach (var i in appliedVideoConditions)
|
||||||
@@ -908,8 +906,7 @@ namespace MediaBrowser.Model.Dlna
|
|||||||
|
|
||||||
var appliedAudioConditions = options.Profile.CodecProfiles
|
var appliedAudioConditions = options.Profile.CodecProfiles
|
||||||
.Where(i => i.Type == CodecType.VideoAudio &&
|
.Where(i => i.Type == CodecType.VideoAudio &&
|
||||||
(string.IsNullOrEmpty(i.Codec) || string.Equals(i.Codec, audioStream?.Codec, StringComparison.OrdinalIgnoreCase)) &&
|
i.ContainsAnyCodec(audioStream?.Codec, container) &&
|
||||||
i.ContainsAnyCodec(audioCodec, container) &&
|
|
||||||
i.ApplyConditions.All(applyCondition => ConditionProcessor.IsVideoAudioConditionSatisfied(applyCondition, audioChannels, inputAudioBitrate, inputAudioSampleRate, inputAudioBitDepth, audioProfile, isSecondaryAudio)));
|
i.ApplyConditions.All(applyCondition => ConditionProcessor.IsVideoAudioConditionSatisfied(applyCondition, audioChannels, inputAudioBitrate, inputAudioSampleRate, inputAudioBitDepth, audioProfile, isSecondaryAudio)));
|
||||||
isFirstAppliedCodecProfile = true;
|
isFirstAppliedCodecProfile = true;
|
||||||
foreach (var i in appliedAudioConditions)
|
foreach (var i in appliedAudioConditions)
|
||||||
@@ -1142,7 +1139,6 @@ namespace MediaBrowser.Model.Dlna
|
|||||||
"VideoCodecProfile",
|
"VideoCodecProfile",
|
||||||
profile.CodecProfiles
|
profile.CodecProfiles
|
||||||
.Where(codecProfile => codecProfile.Type == CodecType.Video &&
|
.Where(codecProfile => codecProfile.Type == CodecType.Video &&
|
||||||
(string.IsNullOrEmpty(codecProfile.Codec) || string.Equals(codecProfile.Codec, videoStream?.Codec, StringComparison.OrdinalIgnoreCase)) &&
|
|
||||||
codecProfile.ContainsAnyCodec(videoStream?.Codec, container) &&
|
codecProfile.ContainsAnyCodec(videoStream?.Codec, container) &&
|
||||||
!checkVideoConditions(codecProfile.ApplyConditions).Any())
|
!checkVideoConditions(codecProfile.ApplyConditions).Any())
|
||||||
.SelectMany(codecProfile => checkVideoConditions(codecProfile.Conditions)));
|
.SelectMany(codecProfile => checkVideoConditions(codecProfile.Conditions)));
|
||||||
@@ -1565,7 +1561,6 @@ namespace MediaBrowser.Model.Dlna
|
|||||||
{
|
{
|
||||||
return codecProfiles
|
return codecProfiles
|
||||||
.Where(profile => profile.Type == CodecType.VideoAudio &&
|
.Where(profile => profile.Type == CodecType.VideoAudio &&
|
||||||
(string.IsNullOrEmpty(profile.Codec) || string.Equals(profile.Codec, codec, StringComparison.OrdinalIgnoreCase)) &&
|
|
||||||
profile.ContainsAnyCodec(codec, container) &&
|
profile.ContainsAnyCodec(codec, container) &&
|
||||||
profile.ApplyConditions.All(applyCondition => ConditionProcessor.IsVideoAudioConditionSatisfied(applyCondition, audioChannels, audioBitrate, audioSampleRate, audioBitDepth, audioProfile, isSecondaryAudio)))
|
profile.ApplyConditions.All(applyCondition => ConditionProcessor.IsVideoAudioConditionSatisfied(applyCondition, audioChannels, audioBitrate, audioSampleRate, audioBitDepth, audioProfile, isSecondaryAudio)))
|
||||||
.SelectMany(profile => profile.Conditions)
|
.SelectMany(profile => profile.Conditions)
|
||||||
@@ -1584,7 +1579,6 @@ namespace MediaBrowser.Model.Dlna
|
|||||||
{
|
{
|
||||||
var conditions = codecProfiles
|
var conditions = codecProfiles
|
||||||
.Where(profile => profile.Type == CodecType.Audio &&
|
.Where(profile => profile.Type == CodecType.Audio &&
|
||||||
(string.IsNullOrEmpty(profile.Codec) || string.Equals(profile.Codec, codec, StringComparison.OrdinalIgnoreCase)) &&
|
|
||||||
profile.ContainsAnyCodec(codec, container) &&
|
profile.ContainsAnyCodec(codec, container) &&
|
||||||
profile.ApplyConditions.All(applyCondition => ConditionProcessor.IsAudioConditionSatisfied(applyCondition, audioChannels, audioBitrate, audioSampleRate, audioBitDepth)))
|
profile.ApplyConditions.All(applyCondition => ConditionProcessor.IsAudioConditionSatisfied(applyCondition, audioChannels, audioBitrate, audioSampleRate, audioBitDepth)))
|
||||||
.SelectMany(profile => profile.Conditions);
|
.SelectMany(profile => profile.Conditions);
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Authors>Jellyfin Contributors</Authors>
|
<Authors>Jellyfin Contributors</Authors>
|
||||||
<PackageId>Jellyfin.Model</PackageId>
|
<PackageId>Jellyfin.Model</PackageId>
|
||||||
<VersionPrefix>10.8.10</VersionPrefix>
|
<VersionPrefix>10.8.13</VersionPrefix>
|
||||||
<RepositoryUrl>https://github.com/jellyfin/jellyfin</RepositoryUrl>
|
<RepositoryUrl>https://github.com/jellyfin/jellyfin</RepositoryUrl>
|
||||||
<PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
|
<PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|||||||
@@ -181,6 +181,10 @@ namespace MediaBrowser.Providers.Manager
|
|||||||
{
|
{
|
||||||
contentType = "image/png";
|
contentType = "image/png";
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new HttpRequestException("Invalid image received: contentType not set.", null, response.StatusCode);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// thetvdb will sometimes serve a rubbish 404 html page with a 200 OK code, because reasons...
|
// thetvdb will sometimes serve a rubbish 404 html page with a 200 OK code, because reasons...
|
||||||
|
|||||||
@@ -176,9 +176,11 @@ namespace MediaBrowser.Providers.MediaInfo
|
|||||||
|
|
||||||
var format = imageStream.Codec switch
|
var format = imageStream.Codec switch
|
||||||
{
|
{
|
||||||
|
"bmp" => ImageFormat.Bmp,
|
||||||
|
"gif" => ImageFormat.Gif,
|
||||||
"mjpeg" => ImageFormat.Jpg,
|
"mjpeg" => ImageFormat.Jpg,
|
||||||
"png" => ImageFormat.Png,
|
"png" => ImageFormat.Png,
|
||||||
"gif" => ImageFormat.Gif,
|
"webp" => ImageFormat.Webp,
|
||||||
_ => ImageFormat.Jpg
|
_ => ImageFormat.Jpg
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -1,4 +1,4 @@
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
|
||||||
[assembly: AssemblyVersion("10.8.10")]
|
[assembly: AssemblyVersion("10.8.13")]
|
||||||
[assembly: AssemblyFileVersion("10.8.10")]
|
[assembly: AssemblyFileVersion("10.8.13")]
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
# We just wrap `build` so this is really it
|
# We just wrap `build` so this is really it
|
||||||
name: "jellyfin"
|
name: "jellyfin"
|
||||||
version: "10.8.10"
|
version: "10.8.13"
|
||||||
packages:
|
packages:
|
||||||
- debian.amd64
|
- debian.amd64
|
||||||
- debian.arm64
|
- debian.arm64
|
||||||
|
|||||||
Vendored
+18
@@ -1,3 +1,21 @@
|
|||||||
|
jellyfin-server (10.8.13-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* New upstream version 10.8.13; release changelog at https://github.com/jellyfin/jellyfin/releases/tag/v10.8.13
|
||||||
|
|
||||||
|
-- Jellyfin Packaging Team <packaging@jellyfin.org> Tue, 28 Nov 2023 22:21:55 -0500
|
||||||
|
|
||||||
|
jellyfin-server (10.8.12-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* New upstream version 10.8.12; release changelog at https://github.com/jellyfin/jellyfin/releases/tag/v10.8.12
|
||||||
|
|
||||||
|
-- Jellyfin Packaging Team <packaging@jellyfin.org> Sat, 04 Nov 2023 14:42:37 -0400
|
||||||
|
|
||||||
|
jellyfin-server (10.8.11-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* New upstream version 10.8.11; release changelog at https://github.com/jellyfin/jellyfin/releases/tag/v10.8.11
|
||||||
|
|
||||||
|
-- Jellyfin Packaging Team <packaging@jellyfin.org> Sat, 23 Sep 2023 21:40:37 -0400
|
||||||
|
|
||||||
jellyfin-server (10.8.10-1) unstable; urgency=medium
|
jellyfin-server (10.8.10-1) unstable; urgency=medium
|
||||||
|
|
||||||
* New upstream version 10.8.10; release changelog at https://github.com/jellyfin/jellyfin/releases/tag/v10.8.10
|
* New upstream version 10.8.10; release changelog at https://github.com/jellyfin/jellyfin/releases/tag/v10.8.10
|
||||||
|
|||||||
Vendored
+3
@@ -27,6 +27,9 @@ JELLYFIN_RESTART_OPT="--restartpath=/usr/lib/jellyfin/restart.sh"
|
|||||||
# ffmpeg binary paths, overriding the system values
|
# ffmpeg binary paths, overriding the system values
|
||||||
JELLYFIN_FFMPEG_OPT="--ffmpeg=/usr/lib/jellyfin-ffmpeg/ffmpeg"
|
JELLYFIN_FFMPEG_OPT="--ffmpeg=/usr/lib/jellyfin-ffmpeg/ffmpeg"
|
||||||
|
|
||||||
|
# Disable glibc dynamic heap adjustment
|
||||||
|
MALLOC_TRIM_THRESHOLD_=131072
|
||||||
|
|
||||||
# [OPTIONAL] run Jellyfin as a headless service
|
# [OPTIONAL] run Jellyfin as a headless service
|
||||||
#JELLYFIN_SERVICE_OPT="--service"
|
#JELLYFIN_SERVICE_OPT="--service"
|
||||||
|
|
||||||
|
|||||||
Vendored
+1
-1
@@ -5,7 +5,7 @@ Homepage: https://jellyfin.org
|
|||||||
Standards-Version: 3.9.2
|
Standards-Version: 3.9.2
|
||||||
|
|
||||||
Package: jellyfin
|
Package: jellyfin
|
||||||
Version: 10.8.10
|
Version: 10.8.13
|
||||||
Maintainer: Jellyfin Packaging Team <packaging@jellyfin.org>
|
Maintainer: Jellyfin Packaging Team <packaging@jellyfin.org>
|
||||||
Depends: jellyfin-server, jellyfin-web
|
Depends: jellyfin-server, jellyfin-web
|
||||||
Description: Provides the Jellyfin Free Software Media System
|
Description: Provides the Jellyfin Free Software Media System
|
||||||
|
|||||||
@@ -26,6 +26,9 @@ JELLYFIN_CACHE_DIR="/var/cache/jellyfin"
|
|||||||
# In-App service control
|
# In-App service control
|
||||||
JELLYFIN_RESTART_OPT="--restartpath=/usr/libexec/jellyfin/restart.sh"
|
JELLYFIN_RESTART_OPT="--restartpath=/usr/libexec/jellyfin/restart.sh"
|
||||||
|
|
||||||
|
# Disable glibc dynamic heap adjustment
|
||||||
|
MALLOC_TRIM_THRESHOLD_=131072
|
||||||
|
|
||||||
# [OPTIONAL] ffmpeg binary paths, overriding the UI-configured values
|
# [OPTIONAL] ffmpeg binary paths, overriding the UI-configured values
|
||||||
#JELLYFIN_FFMPEG_OPT="--ffmpeg=/usr/bin/ffmpeg"
|
#JELLYFIN_FFMPEG_OPT="--ffmpeg=/usr/bin/ffmpeg"
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
Name: jellyfin
|
Name: jellyfin
|
||||||
Version: 10.8.10
|
Version: 10.8.13
|
||||||
Release: 1%{?dist}
|
Release: 1%{?dist}
|
||||||
Summary: The Free Software Media System
|
Summary: The Free Software Media System
|
||||||
License: GPLv2
|
License: GPLv2
|
||||||
@@ -179,6 +179,12 @@ fi
|
|||||||
%systemd_postun_with_restart jellyfin.service
|
%systemd_postun_with_restart jellyfin.service
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Nov 28 2023 Jellyfin Packaging Team <packaging@jellyfin.org>
|
||||||
|
- New upstream version 10.8.13; release changelog at https://github.com/jellyfin/jellyfin/releases/tag/v10.8.13
|
||||||
|
* Sat Nov 04 2023 Jellyfin Packaging Team <packaging@jellyfin.org>
|
||||||
|
- New upstream version 10.8.12; release changelog at https://github.com/jellyfin/jellyfin/releases/tag/v10.8.12
|
||||||
|
* Sat Sep 23 2023 Jellyfin Packaging Team <packaging@jellyfin.org>
|
||||||
|
- New upstream version 10.8.11; release changelog at https://github.com/jellyfin/jellyfin/releases/tag/v10.8.11
|
||||||
* Sun Apr 23 2023 Jellyfin Packaging Team <packaging@jellyfin.org>
|
* Sun Apr 23 2023 Jellyfin Packaging Team <packaging@jellyfin.org>
|
||||||
- New upstream version 10.8.10; release changelog at https://github.com/jellyfin/jellyfin/releases/tag/v10.8.10
|
- New upstream version 10.8.10; release changelog at https://github.com/jellyfin/jellyfin/releases/tag/v10.8.10
|
||||||
* Sun Jan 22 2023 Jellyfin Packaging Team <packaging@jellyfin.org>
|
* Sun Jan 22 2023 Jellyfin Packaging Team <packaging@jellyfin.org>
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Authors>Jellyfin Contributors</Authors>
|
<Authors>Jellyfin Contributors</Authors>
|
||||||
<PackageId>Jellyfin.Extensions</PackageId>
|
<PackageId>Jellyfin.Extensions</PackageId>
|
||||||
<VersionPrefix>10.8.10</VersionPrefix>
|
<VersionPrefix>10.8.13</VersionPrefix>
|
||||||
<RepositoryUrl>https://github.com/jellyfin/jellyfin</RepositoryUrl>
|
<RepositoryUrl>https://github.com/jellyfin/jellyfin</RepositoryUrl>
|
||||||
<PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
|
<PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|||||||
@@ -98,9 +98,11 @@ namespace Jellyfin.Providers.Tests.MediaInfo
|
|||||||
[InlineData(null, null, 1, ImageType.Primary, ImageFormat.Jpg)] // no label, finds primary
|
[InlineData(null, null, 1, ImageType.Primary, ImageFormat.Jpg)] // no label, finds primary
|
||||||
[InlineData("backdrop", null, 2, ImageType.Backdrop, ImageFormat.Jpg)] // uses label to find index 2, not just pulling first stream
|
[InlineData("backdrop", null, 2, ImageType.Backdrop, ImageFormat.Jpg)] // uses label to find index 2, not just pulling first stream
|
||||||
[InlineData("cover", null, 2, ImageType.Primary, ImageFormat.Jpg)] // uses label to find index 2, not just pulling first stream
|
[InlineData("cover", null, 2, ImageType.Primary, ImageFormat.Jpg)] // uses label to find index 2, not just pulling first stream
|
||||||
|
[InlineData(null, "bmp", 1, ImageType.Primary, ImageFormat.Bmp)]
|
||||||
|
[InlineData(null, "gif", 1, ImageType.Primary, ImageFormat.Gif)]
|
||||||
[InlineData(null, "mjpeg", 1, ImageType.Primary, ImageFormat.Jpg)]
|
[InlineData(null, "mjpeg", 1, ImageType.Primary, ImageFormat.Jpg)]
|
||||||
[InlineData(null, "png", 1, ImageType.Primary, ImageFormat.Png)]
|
[InlineData(null, "png", 1, ImageType.Primary, ImageFormat.Png)]
|
||||||
[InlineData(null, "gif", 1, ImageType.Primary, ImageFormat.Gif)]
|
[InlineData(null, "webp", 1, ImageType.Primary, ImageFormat.Webp)]
|
||||||
public async void GetImage_Embedded_ReturnsCorrectSelection(string label, string? codec, int targetIndex, ImageType type, ImageFormat? expectedFormat)
|
public async void GetImage_Embedded_ReturnsCorrectSelection(string label, string? codec, int targetIndex, ImageType type, ImageFormat? expectedFormat)
|
||||||
{
|
{
|
||||||
var streams = new List<MediaStream>();
|
var streams = new List<MediaStream>();
|
||||||
|
|||||||
Reference in New Issue
Block a user