mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-12-22 16:54:46 +03:00
fixes #838 - Support rtmp protocol with channels
This commit is contained in:
@@ -1,16 +1,12 @@
|
||||
using MediaBrowser.Common.Extensions;
|
||||
using MediaBrowser.Common.IO;
|
||||
using MediaBrowser.Common.Net;
|
||||
using MediaBrowser.Controller.Channels;
|
||||
using MediaBrowser.Controller.Configuration;
|
||||
using MediaBrowser.Controller.Dlna;
|
||||
using MediaBrowser.Controller.Dto;
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Controller.Entities.Audio;
|
||||
using MediaBrowser.Controller.Library;
|
||||
using MediaBrowser.Controller.LiveTv;
|
||||
using MediaBrowser.Controller.MediaEncoding;
|
||||
using MediaBrowser.Controller.Persistence;
|
||||
using MediaBrowser.Model.Configuration;
|
||||
using MediaBrowser.Model.Dlna;
|
||||
using MediaBrowser.Model.Drawing;
|
||||
@@ -19,6 +15,7 @@ using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.IO;
|
||||
using MediaBrowser.Model.Library;
|
||||
using MediaBrowser.Model.LiveTv;
|
||||
using MediaBrowser.Model.MediaInfo;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
@@ -639,16 +636,16 @@ namespace MediaBrowser.Api.Playback
|
||||
/// <summary>
|
||||
/// Gets the probe size argument.
|
||||
/// </summary>
|
||||
/// <param name="isVideo">if set to <c>true</c> [is video].</param>
|
||||
/// <param name="videoType">Type of the video.</param>
|
||||
/// <param name="isoType">Type of the iso.</param>
|
||||
/// <param name="state">The state.</param>
|
||||
/// <returns>System.String.</returns>
|
||||
private string GetProbeSizeArgument(bool isVideo, VideoType? videoType, IsoType? isoType)
|
||||
private string GetProbeSizeArgument(StreamState state)
|
||||
{
|
||||
var type = !isVideo ? MediaEncoderHelpers.GetInputType(null, null) :
|
||||
MediaEncoderHelpers.GetInputType(videoType, isoType);
|
||||
if (state.PlayableStreamFileNames.Count > 0)
|
||||
{
|
||||
return MediaEncoder.GetProbeSizeArgument(state.PlayableStreamFileNames.ToArray(), state.InputProtocol);
|
||||
}
|
||||
|
||||
return MediaEncoder.GetProbeSizeArgument(type);
|
||||
return MediaEncoder.GetProbeSizeArgument(new[] { state.MediaPath }, state.InputProtocol);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -765,7 +762,7 @@ namespace MediaBrowser.Api.Playback
|
||||
/// <returns>System.String.</returns>
|
||||
protected string GetInputArgument(StreamState state)
|
||||
{
|
||||
var type = state.IsRemote ? InputType.Url : InputType.File;
|
||||
var protocol = state.InputProtocol;
|
||||
|
||||
var inputPath = new[] { state.MediaPath };
|
||||
|
||||
@@ -773,11 +770,11 @@ namespace MediaBrowser.Api.Playback
|
||||
{
|
||||
if (!(state.VideoType == VideoType.Iso && state.IsoMount == null))
|
||||
{
|
||||
inputPath = MediaEncoderHelpers.GetInputArgument(state.MediaPath, state.IsRemote, state.VideoType, state.IsoType, state.IsoMount, state.PlayableStreamFileNames, out type);
|
||||
inputPath = MediaEncoderHelpers.GetInputArgument(state.MediaPath, state.InputProtocol, state.IsoMount, state.PlayableStreamFileNames);
|
||||
}
|
||||
}
|
||||
|
||||
return MediaEncoder.GetInputArgument(inputPath, type);
|
||||
return MediaEncoder.GetInputArgument(inputPath, protocol);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -885,7 +882,7 @@ namespace MediaBrowser.Api.Playback
|
||||
}
|
||||
|
||||
// This is arbitrary, but add a little buffer time when internet streaming
|
||||
if (state.IsRemote)
|
||||
if (state.InputProtocol != MediaProtocol.File)
|
||||
{
|
||||
await Task.Delay(3000, cancellationTokenSource.Token).ConfigureAwait(false);
|
||||
}
|
||||
@@ -1063,11 +1060,6 @@ namespace MediaBrowser.Api.Playback
|
||||
|
||||
state.RemoteHttpHeaders.TryGetValue("User-Agent", out useragent);
|
||||
|
||||
if (string.IsNullOrWhiteSpace(useragent))
|
||||
{
|
||||
useragent = GetUserAgent(state.MediaPath);
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(useragent))
|
||||
{
|
||||
return "-user-agent \"" + useragent + "\"";
|
||||
@@ -1076,26 +1068,6 @@ namespace MediaBrowser.Api.Playback
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the user agent.
|
||||
/// </summary>
|
||||
/// <param name="path">The path.</param>
|
||||
/// <returns>System.String.</returns>
|
||||
protected string GetUserAgent(string path)
|
||||
{
|
||||
if (string.IsNullOrEmpty(path))
|
||||
{
|
||||
throw new ArgumentNullException("path");
|
||||
|
||||
}
|
||||
if (path.IndexOf("apple.com", StringComparison.OrdinalIgnoreCase) != -1)
|
||||
{
|
||||
return "QuickTime/7.7.4";
|
||||
}
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Processes the exited.
|
||||
/// </summary>
|
||||
@@ -1388,12 +1360,12 @@ namespace MediaBrowser.Api.Playback
|
||||
if (!string.IsNullOrEmpty(path))
|
||||
{
|
||||
state.MediaPath = path;
|
||||
state.IsRemote = false;
|
||||
state.InputProtocol = MediaProtocol.File;
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(mediaUrl))
|
||||
{
|
||||
state.MediaPath = mediaUrl;
|
||||
state.IsRemote = true;
|
||||
state.InputProtocol = MediaProtocol.Http;
|
||||
}
|
||||
|
||||
state.RunTimeTicks = recording.RunTimeTicks;
|
||||
@@ -1425,14 +1397,14 @@ namespace MediaBrowser.Api.Playback
|
||||
if (!string.IsNullOrEmpty(streamInfo.Path))
|
||||
{
|
||||
state.MediaPath = streamInfo.Path;
|
||||
state.IsRemote = false;
|
||||
state.InputProtocol = MediaProtocol.File;
|
||||
|
||||
await Task.Delay(1000, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(streamInfo.Url))
|
||||
{
|
||||
state.MediaPath = streamInfo.Url;
|
||||
state.IsRemote = true;
|
||||
state.InputProtocol = MediaProtocol.Http;
|
||||
}
|
||||
|
||||
state.ReadInputAtNativeFramerate = true;
|
||||
@@ -1445,7 +1417,7 @@ namespace MediaBrowser.Api.Playback
|
||||
{
|
||||
var source = await GetChannelMediaInfo(request.Id, request.MediaSourceId, cancellationToken).ConfigureAwait(false);
|
||||
state.IsInputVideo = string.Equals(item.MediaType, MediaType.Video, StringComparison.OrdinalIgnoreCase);
|
||||
state.IsRemote = source.LocationType == LocationType.Remote;
|
||||
state.InputProtocol = source.Protocol;
|
||||
state.MediaPath = source.Path;
|
||||
state.RunTimeTicks = item.RunTimeTicks;
|
||||
state.RemoteHttpHeaders = source.RequiredHttpHeaders;
|
||||
@@ -1461,7 +1433,7 @@ namespace MediaBrowser.Api.Playback
|
||||
mediaStreams = mediaSource.MediaStreams;
|
||||
|
||||
state.MediaPath = mediaSource.Path;
|
||||
state.IsRemote = mediaSource.LocationType == LocationType.Remote;
|
||||
state.InputProtocol = mediaSource.Protocol;
|
||||
state.InputContainer = mediaSource.Container;
|
||||
|
||||
if (item is Video)
|
||||
@@ -1921,18 +1893,15 @@ namespace MediaBrowser.Api.Playback
|
||||
{
|
||||
var inputModifier = string.Empty;
|
||||
|
||||
var probeSize = GetProbeSizeArgument(state.IsInputVideo, state.VideoType, state.IsoType);
|
||||
var probeSize = GetProbeSizeArgument(state);
|
||||
inputModifier += " " + probeSize;
|
||||
inputModifier = inputModifier.Trim();
|
||||
|
||||
if (state.IsRemote)
|
||||
{
|
||||
var userAgentParam = GetUserAgentParam(state);
|
||||
var userAgentParam = GetUserAgentParam(state);
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(userAgentParam))
|
||||
{
|
||||
inputModifier += " " + userAgentParam;
|
||||
}
|
||||
if (!string.IsNullOrWhiteSpace(userAgentParam))
|
||||
{
|
||||
inputModifier += " " + userAgentParam;
|
||||
}
|
||||
|
||||
inputModifier = inputModifier.Trim();
|
||||
|
||||
Reference in New Issue
Block a user