mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-07-08 23:33:03 +01:00
Merge branch 'master' of https://github.com/MediaBrowser/MediaBrowser
This commit is contained in:
@@ -155,7 +155,7 @@ namespace MediaBrowser.Api
|
||||
|
||||
var games = items.OfType<Game>().ToList();
|
||||
|
||||
summary.ClientInstalledGameCount = games.Count(i => !i.IsPlaceHolder);
|
||||
summary.ClientInstalledGameCount = games.Count(i => i.IsPlaceHolder);
|
||||
|
||||
summary.GameCount = games.Count;
|
||||
|
||||
|
||||
@@ -174,7 +174,7 @@ namespace MediaBrowser.Api.Movies
|
||||
.OrderBy(i => Guid.NewGuid())
|
||||
.ToList();
|
||||
|
||||
var similarToRecentlyPlayed = GetSimilarTo(user, allMovies, recentlyPlayedMovies.Take(10).OrderBy(i => Guid.NewGuid()), itemLimit, fields, RecommendationType.SimilarToRecentlyPlayed).GetEnumerator();
|
||||
var similarToRecentlyPlayed = GetSimilarTo(user, allMovies, recentlyPlayedMovies.Take(7).OrderBy(i => Guid.NewGuid()), itemLimit, fields, RecommendationType.SimilarToRecentlyPlayed).GetEnumerator();
|
||||
var similarToLiked = GetSimilarTo(user, allMovies, likedMovies, itemLimit, fields, RecommendationType.SimilarToLikedItem).GetEnumerator();
|
||||
|
||||
var hasDirectorFromRecentlyPlayed = GetWithDirector(user, allMovies, recentDirectors, itemLimit, fields, RecommendationType.HasDirectorFromRecentlyPlayed).GetEnumerator();
|
||||
|
||||
@@ -279,8 +279,19 @@ namespace MediaBrowser.Api.Playback
|
||||
/// </summary>
|
||||
/// <returns>System.Int32.</returns>
|
||||
/// <exception cref="System.Exception">Unrecognized MediaEncodingQuality value.</exception>
|
||||
protected int GetNumberOfThreads(bool isWebm)
|
||||
protected int GetNumberOfThreads(StreamState state, bool isWebm)
|
||||
{
|
||||
// Use more when this is true. -re will keep cpu usage under control
|
||||
if (state.ReadInputAtNativeFramerate)
|
||||
{
|
||||
if (isWebm)
|
||||
{
|
||||
return Math.Max(Environment.ProcessorCount - 1, 1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Webm: http://www.webmproject.org/docs/encoder-parameters/
|
||||
// The decoder will usually automatically use an appropriate number of threads according to how many cores are available but it can only use multiple threads
|
||||
// for the coefficient data if the encoder selected --token-parts > 0 at encode time.
|
||||
@@ -1191,66 +1202,74 @@ namespace MediaBrowser.Api.Playback
|
||||
request.DeviceId = val;
|
||||
}
|
||||
else if (i == 1)
|
||||
{
|
||||
request.Static = string.Equals("true", val, StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
else if (i == 2)
|
||||
{
|
||||
if (videoRequest != null)
|
||||
{
|
||||
videoRequest.VideoCodec = (VideoCodecs)Enum.Parse(typeof(VideoCodecs), val, true);
|
||||
}
|
||||
}
|
||||
else if (i == 2)
|
||||
else if (i == 3)
|
||||
{
|
||||
request.AudioCodec = (AudioCodecs)Enum.Parse(typeof(AudioCodecs), val, true);
|
||||
}
|
||||
else if (i == 3)
|
||||
else if (i == 4)
|
||||
{
|
||||
if (videoRequest != null)
|
||||
{
|
||||
videoRequest.AudioStreamIndex = int.Parse(val, UsCulture);
|
||||
}
|
||||
}
|
||||
else if (i == 4)
|
||||
else if (i == 5)
|
||||
{
|
||||
if (videoRequest != null)
|
||||
{
|
||||
videoRequest.SubtitleStreamIndex = int.Parse(val, UsCulture);
|
||||
}
|
||||
}
|
||||
else if (i == 5)
|
||||
else if (i == 6)
|
||||
{
|
||||
if (videoRequest != null)
|
||||
{
|
||||
videoRequest.VideoBitRate = int.Parse(val, UsCulture);
|
||||
}
|
||||
}
|
||||
else if (i == 6)
|
||||
else if (i == 7)
|
||||
{
|
||||
request.AudioBitRate = int.Parse(val, UsCulture);
|
||||
}
|
||||
else if (i == 7)
|
||||
else if (i == 8)
|
||||
{
|
||||
request.AudioChannels = int.Parse(val, UsCulture);
|
||||
}
|
||||
else if (i == 8)
|
||||
else if (i == 9)
|
||||
{
|
||||
if (videoRequest != null)
|
||||
{
|
||||
request.StartTimeTicks = long.Parse(val, UsCulture);
|
||||
}
|
||||
}
|
||||
else if (i == 9)
|
||||
else if (i == 10)
|
||||
{
|
||||
if (videoRequest != null)
|
||||
{
|
||||
videoRequest.Profile = val;
|
||||
}
|
||||
}
|
||||
else if (i == 10)
|
||||
else if (i == 11)
|
||||
{
|
||||
if (videoRequest != null)
|
||||
{
|
||||
videoRequest.Level = val;
|
||||
}
|
||||
}
|
||||
else if (i == 12)
|
||||
{
|
||||
request.ForcedMimeType = val;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1334,6 +1353,7 @@ namespace MediaBrowser.Api.Playback
|
||||
await Task.Delay(1000, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
state.ReadInputAtNativeFramerate = recording.RecordingInfo.Status == RecordingStatus.InProgress;
|
||||
state.AudioSync = "1000";
|
||||
state.DeInterlace = true;
|
||||
}
|
||||
@@ -1420,8 +1440,8 @@ namespace MediaBrowser.Api.Playback
|
||||
|
||||
state.HasMediaStreams = mediaStreams.Count > 0;
|
||||
|
||||
state.SegmentLength = state.ReadInputAtNativeFramerate ? 3 : 10;
|
||||
state.HlsListSize = state.ReadInputAtNativeFramerate ? 20 : 1440;
|
||||
state.SegmentLength = state.ReadInputAtNativeFramerate ? 5 : 10;
|
||||
state.HlsListSize = state.ReadInputAtNativeFramerate ? 100 : 1440;
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
@@ -278,7 +278,7 @@ namespace MediaBrowser.Api.Playback.Hls
|
||||
|
||||
var itsOffset = itsOffsetMs == 0 ? string.Empty : string.Format("-itsoffset {0} ", TimeSpan.FromMilliseconds(itsOffsetMs).TotalSeconds);
|
||||
|
||||
var threads = GetNumberOfThreads(false);
|
||||
var threads = GetNumberOfThreads(state, false);
|
||||
|
||||
var inputModifier = GetInputModifier(state);
|
||||
|
||||
|
||||
@@ -102,7 +102,7 @@ namespace MediaBrowser.Api.Playback.Progressive
|
||||
|
||||
const string vn = " -vn";
|
||||
|
||||
var threads = GetNumberOfThreads(false);
|
||||
var threads = GetNumberOfThreads(state, false);
|
||||
|
||||
var inputModifier = GetInputModifier(state);
|
||||
|
||||
|
||||
@@ -214,12 +214,16 @@ namespace MediaBrowser.Api.Playback.Progressive
|
||||
|
||||
if (request.Static)
|
||||
{
|
||||
return ResultFactory.GetStaticFileResult(Request, state.MediaPath, FileShare.Read, responseHeaders, isHeadRequest);
|
||||
var contentType = state.GetMimeType(state.MediaPath);
|
||||
|
||||
return ResultFactory.GetStaticFileResult(Request, state.MediaPath, contentType, FileShare.Read, responseHeaders, isHeadRequest);
|
||||
}
|
||||
|
||||
if (outputPathExists && !ApiEntryPoint.Instance.HasActiveTranscodingJob(outputPath, TranscodingJobType.Progressive))
|
||||
{
|
||||
return ResultFactory.GetStaticFileResult(Request, outputPath, FileShare.Read, responseHeaders, isHeadRequest);
|
||||
var contentType = state.GetMimeType(outputPath);
|
||||
|
||||
return ResultFactory.GetStaticFileResult(Request, outputPath, contentType, FileShare.Read, responseHeaders, isHeadRequest);
|
||||
}
|
||||
|
||||
return GetStreamResult(state, responseHeaders, isHeadRequest).Result;
|
||||
@@ -287,7 +291,7 @@ namespace MediaBrowser.Api.Playback.Progressive
|
||||
|
||||
responseHeaders["Accept-Ranges"] = "none";
|
||||
|
||||
var contentType = MimeTypes.GetMimeType(outputPath);
|
||||
var contentType = state.GetMimeType(outputPath);
|
||||
|
||||
// Headers only
|
||||
if (isHeadRequest)
|
||||
|
||||
@@ -102,7 +102,7 @@ namespace MediaBrowser.Api.Playback.Progressive
|
||||
format = " -f mp4 -movflags frag_keyframe+empty_moov";
|
||||
}
|
||||
|
||||
var threads = GetNumberOfThreads(string.Equals(videoCodec, "libvpx", StringComparison.OrdinalIgnoreCase));
|
||||
var threads = GetNumberOfThreads(state, string.Equals(videoCodec, "libvpx", StringComparison.OrdinalIgnoreCase));
|
||||
|
||||
var inputModifier = GetInputModifier(state);
|
||||
|
||||
|
||||
@@ -66,6 +66,8 @@ namespace MediaBrowser.Api.Playback
|
||||
public bool ThrowDebugError { get; set; }
|
||||
|
||||
public string Params { get; set; }
|
||||
|
||||
public string ForcedMimeType { get; set; }
|
||||
}
|
||||
|
||||
public class VideoStreamRequest : StreamRequest
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Common.Net;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.IO;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
@@ -72,5 +73,20 @@ namespace MediaBrowser.Api.Playback
|
||||
public string InputVideoCodec { get; set; }
|
||||
|
||||
public string InputAudioCodec { get; set; }
|
||||
|
||||
public string GetMimeType(string outputPath)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(Request.ForcedMimeType))
|
||||
{
|
||||
if (VideoRequest == null)
|
||||
{
|
||||
return "audio/" + Request.ForcedMimeType;
|
||||
}
|
||||
|
||||
return "video/" + Request.ForcedMimeType;
|
||||
}
|
||||
|
||||
return MimeTypes.GetMimeType(outputPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user