aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Model/Dlna/StreamInfo.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Model/Dlna/StreamInfo.cs')
-rw-r--r--MediaBrowser.Model/Dlna/StreamInfo.cs102
1 files changed, 59 insertions, 43 deletions
diff --git a/MediaBrowser.Model/Dlna/StreamInfo.cs b/MediaBrowser.Model/Dlna/StreamInfo.cs
index a78a28e13..fc146df30 100644
--- a/MediaBrowser.Model/Dlna/StreamInfo.cs
+++ b/MediaBrowser.Model/Dlna/StreamInfo.cs
@@ -1,9 +1,10 @@
-#nullable disable
#pragma warning disable CS1591
using System;
using System.Collections.Generic;
using System.Globalization;
+using System.Linq;
+using Jellyfin.Data.Enums;
using MediaBrowser.Model.Drawing;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
@@ -33,9 +34,9 @@ namespace MediaBrowser.Model.Dlna
public DlnaProfileType MediaType { get; set; }
- public string Container { get; set; }
+ public string? Container { get; set; }
- public string SubProtocol { get; set; }
+ public string? SubProtocol { get; set; }
public long StartPositionTicks { get; set; }
@@ -79,11 +80,11 @@ namespace MediaBrowser.Model.Dlna
public float? MaxFramerate { get; set; }
- public DeviceProfile DeviceProfile { get; set; }
+ public required DeviceProfile DeviceProfile { get; set; }
- public string DeviceProfileId { get; set; }
+ public string? DeviceProfileId { get; set; }
- public string DeviceId { get; set; }
+ public string? DeviceId { get; set; }
public long? RunTimeTicks { get; set; }
@@ -91,21 +92,21 @@ namespace MediaBrowser.Model.Dlna
public bool EstimateContentLength { get; set; }
- public MediaSourceInfo MediaSource { get; set; }
+ public MediaSourceInfo? MediaSource { get; set; }
public string[] SubtitleCodecs { get; set; }
public SubtitleDeliveryMethod SubtitleDeliveryMethod { get; set; }
- public string SubtitleFormat { get; set; }
+ public string? SubtitleFormat { get; set; }
- public string PlaySessionId { get; set; }
+ public string? PlaySessionId { get; set; }
public TranscodeReason TranscodeReasons { get; set; }
public Dictionary<string, string> StreamOptions { get; private set; }
- public string MediaSourceId => MediaSource?.Id;
+ public string? MediaSourceId => MediaSource?.Id;
public bool IsDirectStream => MediaSource?.VideoType is not (VideoType.Dvd or VideoType.BluRay)
&& PlayMethod is PlayMethod.DirectStream or PlayMethod.DirectPlay;
@@ -113,12 +114,12 @@ namespace MediaBrowser.Model.Dlna
/// <summary>
/// Gets the audio stream that will be used.
/// </summary>
- public MediaStream TargetAudioStream => MediaSource?.GetDefaultAudioStream(AudioStreamIndex);
+ public MediaStream? TargetAudioStream => MediaSource?.GetDefaultAudioStream(AudioStreamIndex);
/// <summary>
/// Gets the video stream that will be used.
/// </summary>
- public MediaStream TargetVideoStream => MediaSource?.VideoStream;
+ public MediaStream? TargetVideoStream => MediaSource?.VideoStream;
/// <summary>
/// Gets the audio sample rate that will be in the output stream.
@@ -258,7 +259,7 @@ namespace MediaBrowser.Model.Dlna
/// <summary>
/// Gets the audio sample rate that will be in the output stream.
/// </summary>
- public string TargetVideoProfile
+ public string? TargetVideoProfile
{
get
{
@@ -281,23 +282,24 @@ namespace MediaBrowser.Model.Dlna
/// <summary>
/// Gets the target video range type that will be in the output stream.
/// </summary>
- public string TargetVideoRangeType
+ public VideoRangeType TargetVideoRangeType
{
get
{
if (IsDirectStream)
{
- return TargetVideoStream?.VideoRangeType;
+ return TargetVideoStream?.VideoRangeType ?? VideoRangeType.Unknown;
}
var targetVideoCodecs = TargetVideoCodec;
var videoCodec = targetVideoCodecs.Length == 0 ? null : targetVideoCodecs[0];
- if (!string.IsNullOrEmpty(videoCodec))
+ if (!string.IsNullOrEmpty(videoCodec)
+ && Enum.TryParse(GetOption(videoCodec, "rangetype"), true, out VideoRangeType videoRangeType))
{
- return GetOption(videoCodec, "rangetype");
+ return videoRangeType;
}
- return TargetVideoStream?.VideoRangeType;
+ return TargetVideoStream?.VideoRangeType ?? VideoRangeType.Unknown;
}
}
@@ -305,7 +307,7 @@ namespace MediaBrowser.Model.Dlna
/// Gets the target video codec tag.
/// </summary>
/// <value>The target video codec tag.</value>
- public string TargetVideoCodecTag
+ public string? TargetVideoCodecTag
{
get
{
@@ -362,7 +364,7 @@ namespace MediaBrowser.Model.Dlna
{
var stream = TargetAudioStream;
- string inputCodec = stream?.Codec;
+ string? inputCodec = stream?.Codec;
if (IsDirectStream)
{
@@ -387,7 +389,7 @@ namespace MediaBrowser.Model.Dlna
{
var stream = TargetVideoStream;
- string inputCodec = stream?.Codec;
+ string? inputCodec = stream?.Codec;
if (IsDirectStream)
{
@@ -415,7 +417,7 @@ namespace MediaBrowser.Model.Dlna
{
if (IsDirectStream)
{
- return MediaSource.Size;
+ return MediaSource?.Size;
}
if (RunTimeTicks.HasValue)
@@ -578,7 +580,7 @@ namespace MediaBrowser.Model.Dlna
}
}
- public void SetOption(string qualifier, string name, string value)
+ public void SetOption(string? qualifier, string name, string value)
{
if (string.IsNullOrEmpty(qualifier))
{
@@ -595,7 +597,7 @@ namespace MediaBrowser.Model.Dlna
StreamOptions[name] = value;
}
- public string GetOption(string qualifier, string name)
+ public string? GetOption(string? qualifier, string name)
{
var value = GetOption(qualifier + "-" + name);
@@ -607,7 +609,7 @@ namespace MediaBrowser.Model.Dlna
return value;
}
- public string GetOption(string name)
+ public string? GetOption(string name)
{
if (StreamOptions.TryGetValue(name, out var value))
{
@@ -617,7 +619,7 @@ namespace MediaBrowser.Model.Dlna
return null;
}
- public string ToUrl(string baseUrl, string accessToken)
+ public string ToUrl(string baseUrl, string? accessToken)
{
ArgumentException.ThrowIfNullOrEmpty(baseUrl);
@@ -684,7 +686,7 @@ namespace MediaBrowser.Model.Dlna
return string.Format(CultureInfo.InvariantCulture, "{0}/videos/{1}/stream{2}?{3}", baseUrl, ItemId, extension, queryString);
}
- private static IEnumerable<NameValuePair> BuildParams(StreamInfo item, string accessToken)
+ private static IEnumerable<NameValuePair> BuildParams(StreamInfo item, string? accessToken)
{
var list = new List<NameValuePair>();
@@ -728,7 +730,7 @@ namespace MediaBrowser.Model.Dlna
list.Add(new NameValuePair("PlaySessionId", item.PlaySessionId ?? string.Empty));
list.Add(new NameValuePair("api_key", accessToken ?? string.Empty));
- string liveStreamId = item.MediaSource?.LiveStreamId;
+ string? liveStreamId = item.MediaSource?.LiveStreamId;
list.Add(new NameValuePair("LiveStreamId", liveStreamId ?? string.Empty));
list.Add(new NameValuePair("SubtitleMethod", item.SubtitleStreamIndex.HasValue && item.SubtitleDeliveryMethod != SubtitleDeliveryMethod.External ? item.SubtitleDeliveryMethod.ToString() : string.Empty));
@@ -770,7 +772,7 @@ namespace MediaBrowser.Model.Dlna
list.Add(new NameValuePair("RequireAvc", item.RequireAvc.ToString(CultureInfo.InvariantCulture).ToLowerInvariant()));
}
- list.Add(new NameValuePair("Tag", item.MediaSource.ETag ?? string.Empty));
+ list.Add(new NameValuePair("Tag", item.MediaSource?.ETag ?? string.Empty));
string subtitleCodecs = item.SubtitleCodecs.Length == 0 ?
string.Empty :
@@ -814,13 +816,18 @@ namespace MediaBrowser.Model.Dlna
return list;
}
- public IEnumerable<SubtitleStreamInfo> GetSubtitleProfiles(ITranscoderSupport transcoderSupport, bool includeSelectedTrackOnly, string baseUrl, string accessToken)
+ public IEnumerable<SubtitleStreamInfo> GetSubtitleProfiles(ITranscoderSupport transcoderSupport, bool includeSelectedTrackOnly, string baseUrl, string? accessToken)
{
return GetSubtitleProfiles(transcoderSupport, includeSelectedTrackOnly, false, baseUrl, accessToken);
}
- public IEnumerable<SubtitleStreamInfo> GetSubtitleProfiles(ITranscoderSupport transcoderSupport, bool includeSelectedTrackOnly, bool enableAllProfiles, string baseUrl, string accessToken)
+ public IEnumerable<SubtitleStreamInfo> GetSubtitleProfiles(ITranscoderSupport transcoderSupport, bool includeSelectedTrackOnly, bool enableAllProfiles, string baseUrl, string? accessToken)
{
+ if (MediaSource is null)
+ {
+ return Enumerable.Empty<SubtitleStreamInfo>();
+ }
+
var list = new List<SubtitleStreamInfo>();
// HLS will preserve timestamps so we can just grab the full subtitle stream
@@ -854,27 +861,36 @@ namespace MediaBrowser.Model.Dlna
return list;
}
- private void AddSubtitleProfiles(List<SubtitleStreamInfo> list, MediaStream stream, ITranscoderSupport transcoderSupport, bool enableAllProfiles, string baseUrl, string accessToken, long startPositionTicks)
+ private void AddSubtitleProfiles(List<SubtitleStreamInfo> list, MediaStream stream, ITranscoderSupport transcoderSupport, bool enableAllProfiles, string baseUrl, string? accessToken, long startPositionTicks)
{
if (enableAllProfiles)
{
foreach (var profile in DeviceProfile.SubtitleProfiles)
{
var info = GetSubtitleStreamInfo(stream, baseUrl, accessToken, startPositionTicks, new[] { profile }, transcoderSupport);
-
- list.Add(info);
+ if (info is not null)
+ {
+ list.Add(info);
+ }
}
}
else
{
var info = GetSubtitleStreamInfo(stream, baseUrl, accessToken, startPositionTicks, DeviceProfile.SubtitleProfiles, transcoderSupport);
-
- list.Add(info);
+ if (info is not null)
+ {
+ list.Add(info);
+ }
}
}
- private SubtitleStreamInfo GetSubtitleStreamInfo(MediaStream stream, string baseUrl, string accessToken, long startPositionTicks, SubtitleProfile[] subtitleProfiles, ITranscoderSupport transcoderSupport)
+ private SubtitleStreamInfo? GetSubtitleStreamInfo(MediaStream stream, string baseUrl, string? accessToken, long startPositionTicks, SubtitleProfile[] subtitleProfiles, ITranscoderSupport transcoderSupport)
{
+ if (MediaSource is null)
+ {
+ return null;
+ }
+
var subtitleProfile = StreamBuilder.GetSubtitleProfile(MediaSource, stream, subtitleProfiles, PlayMethod, transcoderSupport, Container, SubProtocol);
var info = new SubtitleStreamInfo
{
@@ -918,7 +934,7 @@ namespace MediaBrowser.Model.Dlna
return info;
}
- public int? GetTargetVideoBitDepth(string codec)
+ public int? GetTargetVideoBitDepth(string? codec)
{
var value = GetOption(codec, "videobitdepth");
@@ -930,7 +946,7 @@ namespace MediaBrowser.Model.Dlna
return null;
}
- public int? GetTargetAudioBitDepth(string codec)
+ public int? GetTargetAudioBitDepth(string? codec)
{
var value = GetOption(codec, "audiobitdepth");
@@ -942,7 +958,7 @@ namespace MediaBrowser.Model.Dlna
return null;
}
- public double? GetTargetVideoLevel(string codec)
+ public double? GetTargetVideoLevel(string? codec)
{
var value = GetOption(codec, "level");
@@ -954,7 +970,7 @@ namespace MediaBrowser.Model.Dlna
return null;
}
- public int? GetTargetRefFrames(string codec)
+ public int? GetTargetRefFrames(string? codec)
{
var value = GetOption(codec, "maxrefframes");
@@ -966,7 +982,7 @@ namespace MediaBrowser.Model.Dlna
return null;
}
- public int? GetTargetAudioChannels(string codec)
+ public int? GetTargetAudioChannels(string? codec)
{
var defaultValue = GlobalMaxAudioChannels ?? TranscodingMaxAudioChannels;
@@ -986,7 +1002,7 @@ namespace MediaBrowser.Model.Dlna
private int? GetMediaStreamCount(MediaStreamType type, int limit)
{
- var count = MediaSource.GetStreamCount(type);
+ var count = MediaSource?.GetStreamCount(type);
if (count.HasValue)
{