aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Model/Dlna
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2014-08-05 19:59:24 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2014-08-05 19:59:24 -0400
commit3ba6364f259ea43979a88b2a83d64292119057dc (patch)
tree5663fb9c54387e92a09d219488ad1af9276232aa /MediaBrowser.Model/Dlna
parent7e25c857a551ce06025b3b85996aef7ed3c6571e (diff)
fixes #887 - Support ttml subtitle output
Diffstat (limited to 'MediaBrowser.Model/Dlna')
-rw-r--r--MediaBrowser.Model/Dlna/StreamBuilder.cs48
-rw-r--r--MediaBrowser.Model/Dlna/StreamInfo.cs43
-rw-r--r--MediaBrowser.Model/Dlna/SubtitleProfile.cs9
3 files changed, 54 insertions, 46 deletions
diff --git a/MediaBrowser.Model/Dlna/StreamBuilder.cs b/MediaBrowser.Model/Dlna/StreamBuilder.cs
index 6e929564e4..22e817de15 100644
--- a/MediaBrowser.Model/Dlna/StreamBuilder.cs
+++ b/MediaBrowser.Model/Dlna/StreamBuilder.cs
@@ -2,6 +2,7 @@
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.MediaInfo;
+using MediaBrowser.Model.Session;
using System;
using System.Collections.Generic;
@@ -9,7 +10,7 @@ namespace MediaBrowser.Model.Dlna
{
public class StreamBuilder
{
- private string[] _serverTextSubtitleOutputs = new string[] { "srt", "vtt" };
+ private readonly string[] _serverTextSubtitleOutputs = { "srt", "vtt", "ttml" };
public StreamInfo BuildAudioItem(AudioOptions options)
{
@@ -158,7 +159,7 @@ namespace MediaBrowser.Model.Dlna
if (all)
{
- playlistItem.IsDirectStream = true;
+ playlistItem.PlayMethod = PlayMethod.DirectStream;
playlistItem.Container = item.Container;
return playlistItem;
@@ -179,7 +180,7 @@ namespace MediaBrowser.Model.Dlna
if (transcodingProfile != null)
{
- playlistItem.IsDirectStream = false;
+ playlistItem.PlayMethod = PlayMethod.Transcode;
playlistItem.TranscodeSeekInfo = transcodingProfile.TranscodeSeekInfo;
playlistItem.EstimateContentLength = transcodingProfile.EstimateContentLength;
playlistItem.Container = transcodingProfile.Container;
@@ -252,12 +253,12 @@ namespace MediaBrowser.Model.Dlna
if (directPlay != null)
{
- playlistItem.IsDirectStream = true;
+ playlistItem.PlayMethod = PlayMethod.DirectStream;
playlistItem.Container = item.Container;
if (subtitleStream != null)
{
- playlistItem.SubtitleDeliveryMethod = GetDirectStreamSubtitleDeliveryMethod(subtitleStream, options);
+ playlistItem.SubtitleDeliveryMethod = GetSubtitleDeliveryMethod(subtitleStream, options);
}
return playlistItem;
@@ -279,10 +280,10 @@ namespace MediaBrowser.Model.Dlna
{
if (subtitleStream != null)
{
- playlistItem.SubtitleDeliveryMethod = GetTranscodedSubtitleDeliveryMethod(subtitleStream, options);
+ playlistItem.SubtitleDeliveryMethod = GetSubtitleDeliveryMethod(subtitleStream, options);
}
- playlistItem.IsDirectStream = false;
+ playlistItem.PlayMethod = PlayMethod.Transcode;
playlistItem.Container = transcodingProfile.Container;
playlistItem.EstimateContentLength = transcodingProfile.EstimateContentLength;
playlistItem.TranscodeSeekInfo = transcodingProfile.TranscodeSeekInfo;
@@ -499,9 +500,9 @@ namespace MediaBrowser.Model.Dlna
return false;
}
- SubtitleDeliveryMethod subtitleMethod = GetDirectStreamSubtitleDeliveryMethod(subtitleStream, options);
+ SubtitleDeliveryMethod subtitleMethod = GetSubtitleDeliveryMethod(subtitleStream, options);
- if (subtitleMethod != SubtitleDeliveryMethod.External && subtitleMethod != SubtitleDeliveryMethod.Direct)
+ if (subtitleMethod != SubtitleDeliveryMethod.External && subtitleMethod != SubtitleDeliveryMethod.Embed)
{
return false;
}
@@ -510,34 +511,7 @@ namespace MediaBrowser.Model.Dlna
return IsAudioEligibleForDirectPlay(item, maxBitrate);
}
- private SubtitleDeliveryMethod GetDirectStreamSubtitleDeliveryMethod(MediaStream subtitleStream,
- VideoOptions options)
- {
- if (subtitleStream.IsTextSubtitleStream)
- {
- string subtitleFormat = NormalizeSubtitleFormat(subtitleStream.Codec);
-
- bool supportsDirect = ContainsSubtitleFormat(options.Profile.SoftSubtitleProfiles, new[] { subtitleFormat });
-
- if (supportsDirect)
- {
- return SubtitleDeliveryMethod.Direct;
- }
-
- // See if the device can retrieve the subtitles externally
- bool supportsSubsExternally = options.Context == EncodingContext.Streaming &&
- ContainsSubtitleFormat(options.Profile.ExternalSubtitleProfiles, _serverTextSubtitleOutputs);
-
- if (supportsSubsExternally)
- {
- return SubtitleDeliveryMethod.External;
- }
- }
-
- return SubtitleDeliveryMethod.Encode;
- }
-
- private SubtitleDeliveryMethod GetTranscodedSubtitleDeliveryMethod(MediaStream subtitleStream,
+ private SubtitleDeliveryMethod GetSubtitleDeliveryMethod(MediaStream subtitleStream,
VideoOptions options)
{
if (subtitleStream.IsTextSubtitleStream)
diff --git a/MediaBrowser.Model/Dlna/StreamInfo.cs b/MediaBrowser.Model/Dlna/StreamInfo.cs
index 8bf9f2a04e..4f02d64508 100644
--- a/MediaBrowser.Model/Dlna/StreamInfo.cs
+++ b/MediaBrowser.Model/Dlna/StreamInfo.cs
@@ -3,6 +3,7 @@ using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.MediaInfo;
+using MediaBrowser.Model.Session;
using System;
using System.Collections.Generic;
@@ -15,7 +16,7 @@ namespace MediaBrowser.Model.Dlna
{
public string ItemId { get; set; }
- public bool IsDirectStream { get; set; }
+ public PlayMethod PlayMethod { get; set; }
public DlnaProfileType MediaType { get; set; }
@@ -59,6 +60,7 @@ namespace MediaBrowser.Model.Dlna
public MediaSourceInfo MediaSource { get; set; }
public SubtitleDeliveryMethod SubtitleDeliveryMethod { get; set; }
+ public string SubtitleFormat { get; set; }
public string MediaSourceId
{
@@ -68,6 +70,11 @@ namespace MediaBrowser.Model.Dlna
}
}
+ public bool IsDirectStream
+ {
+ get { return PlayMethod == PlayMethod.DirectStream; }
+ }
+
public string ToUrl(string baseUrl)
{
return ToDlnaUrl(baseUrl);
@@ -124,6 +131,32 @@ namespace MediaBrowser.Model.Dlna
return string.Format("Params={0}", string.Join(";", list.ToArray()));
}
+ public string ToSubtitleUrl(string baseUrl)
+ {
+ if (SubtitleDeliveryMethod != SubtitleDeliveryMethod.External)
+ {
+ return null;
+ }
+
+ if (!SubtitleStreamIndex.HasValue)
+ {
+ return null;
+ }
+
+ // HLS will preserve timestamps so we can just grab the full subtitle stream
+ long startPositionTicks = StringHelper.EqualsIgnoreCase(Protocol, "hls")
+ ? 0
+ : StartPositionTicks;
+
+ return string.Format("{0}/Videos/{1}/{2}/Subtitles/{3}/{4}/Stream.{5}",
+ baseUrl,
+ ItemId,
+ MediaSourceId,
+ StringHelper.ToStringCultureInvariant(SubtitleStreamIndex.Value),
+ StringHelper.ToStringCultureInvariant(startPositionTicks),
+ SubtitleFormat);
+ }
+
/// <summary>
/// Returns the audio stream that will be used
/// </summary>
@@ -437,16 +470,12 @@ namespace MediaBrowser.Model.Dlna
/// </summary>
Encode = 0,
/// <summary>
- /// Internal format is supported natively
- /// </summary>
- Direct = 1,
- /// <summary>
/// The embed
/// </summary>
- Embed = 2,
+ Embed = 1,
/// <summary>
/// The external
/// </summary>
- External = 3
+ External = 2
}
}
diff --git a/MediaBrowser.Model/Dlna/SubtitleProfile.cs b/MediaBrowser.Model/Dlna/SubtitleProfile.cs
index ec38d96aeb..7aa5e17713 100644
--- a/MediaBrowser.Model/Dlna/SubtitleProfile.cs
+++ b/MediaBrowser.Model/Dlna/SubtitleProfile.cs
@@ -1,8 +1,13 @@
-
+using System.Xml.Serialization;
+
namespace MediaBrowser.Model.Dlna
{
public class SubtitleProfile
{
+ [XmlAttribute("format")]
public string Format { get; set; }
+
+ [XmlAttribute("protocol")]
+ public string Protocol { get; set; }
}
-}
+} \ No newline at end of file