aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.MediaEncoding
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.MediaEncoding')
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/AudioEncoder.cs2
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs24
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs54
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs10
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/VideoEncoder.cs2
-rw-r--r--MediaBrowser.MediaEncoding/Subtitles/AssParser.cs46
-rw-r--r--MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs6
7 files changed, 73 insertions, 71 deletions
diff --git a/MediaBrowser.MediaEncoding/Encoder/AudioEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/AudioEncoder.cs
index 52221d349..a6a87a3fc 100644
--- a/MediaBrowser.MediaEncoding/Encoder/AudioEncoder.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/AudioEncoder.cs
@@ -14,7 +14,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
{
public class AudioEncoder : BaseEncoder
{
- public AudioEncoder(MediaEncoder mediaEncoder, ILogger logger, IServerConfigurationManager configurationManager, IFileSystem fileSystem, ILiveTvManager liveTvManager, IIsoManager isoManager, ILibraryManager libraryManager, IChannelManager channelManager, ISessionManager sessionManager, ISubtitleEncoder subtitleEncoder) : base(mediaEncoder, logger, configurationManager, fileSystem, liveTvManager, isoManager, libraryManager, channelManager, sessionManager, subtitleEncoder)
+ public AudioEncoder(MediaEncoder mediaEncoder, ILogger logger, IServerConfigurationManager configurationManager, IFileSystem fileSystem, ILiveTvManager liveTvManager, IIsoManager isoManager, ILibraryManager libraryManager, IChannelManager channelManager, ISessionManager sessionManager, ISubtitleEncoder subtitleEncoder, IMediaSourceManager mediaSourceManager) : base(mediaEncoder, logger, configurationManager, fileSystem, liveTvManager, isoManager, libraryManager, channelManager, sessionManager, subtitleEncoder, mediaSourceManager)
{
}
diff --git a/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs
index ffae8612e..6ddc3487d 100644
--- a/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs
@@ -36,6 +36,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
protected readonly IChannelManager ChannelManager;
protected readonly ISessionManager SessionManager;
protected readonly ISubtitleEncoder SubtitleEncoder;
+ protected readonly IMediaSourceManager MediaSourceManager;
protected readonly CultureInfo UsCulture = new CultureInfo("en-US");
@@ -47,7 +48,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
IIsoManager isoManager,
ILibraryManager libraryManager,
IChannelManager channelManager,
- ISessionManager sessionManager, ISubtitleEncoder subtitleEncoder)
+ ISessionManager sessionManager, ISubtitleEncoder subtitleEncoder, IMediaSourceManager mediaSourceManager)
{
MediaEncoder = mediaEncoder;
Logger = logger;
@@ -59,13 +60,14 @@ namespace MediaBrowser.MediaEncoding.Encoder
ChannelManager = channelManager;
SessionManager = sessionManager;
SubtitleEncoder = subtitleEncoder;
+ MediaSourceManager = mediaSourceManager;
}
public async Task<EncodingJob> Start(EncodingJobOptions options,
IProgress<double> progress,
CancellationToken cancellationToken)
{
- var encodingJob = await new EncodingJobFactory(Logger, LiveTvManager, LibraryManager, ChannelManager)
+ var encodingJob = await new EncodingJobFactory(Logger, LiveTvManager, LibraryManager, ChannelManager, MediaSourceManager)
.CreateJob(options, IsVideoEncoder, progress, cancellationToken).ConfigureAwait(false);
encodingJob.OutputFilePath = GetOutputFilePath(encodingJob);
@@ -452,24 +454,6 @@ namespace MediaBrowser.MediaEncoding.Encoder
private string GetInputPathArgument(EncodingJob job)
{
- //if (job.InputProtocol == MediaProtocol.File &&
- // job.RunTimeTicks.HasValue &&
- // job.VideoType == VideoType.VideoFile &&
- // !string.Equals(job.OutputVideoCodec, "copy", StringComparison.OrdinalIgnoreCase))
- //{
- // if (job.RunTimeTicks.Value >= TimeSpan.FromMinutes(5).Ticks && job.IsInputVideo)
- // {
- // if (SupportsThrottleWithStream)
- // {
- // var url = "http://localhost:" + ServerConfigurationManager.Configuration.HttpServerPortNumber.ToString(UsCulture) + "/videos/" + job.Request.Id + "/stream?static=true&Throttle=true&mediaSourceId=" + job.Request.MediaSourceId;
-
- // url += "&transcodingJobId=" + transcodingJobId;
-
- // return string.Format("\"{0}\"", url);
- // }
- // }
- //}
-
var protocol = job.InputProtocol;
var inputPath = new[] { job.MediaPath };
diff --git a/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs b/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs
index 925d17bc6..c5783e188 100644
--- a/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs
@@ -4,7 +4,6 @@ using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.LiveTv;
using MediaBrowser.Controller.MediaEncoding;
using MediaBrowser.Model.Dlna;
-using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.MediaInfo;
@@ -23,15 +22,17 @@ namespace MediaBrowser.MediaEncoding.Encoder
private readonly ILiveTvManager _liveTvManager;
private readonly ILibraryManager _libraryManager;
private readonly IChannelManager _channelManager;
+ private readonly IMediaSourceManager _mediaSourceManager;
protected static readonly CultureInfo UsCulture = new CultureInfo("en-US");
- public EncodingJobFactory(ILogger logger, ILiveTvManager liveTvManager, ILibraryManager libraryManager, IChannelManager channelManager)
+ public EncodingJobFactory(ILogger logger, ILiveTvManager liveTvManager, ILibraryManager libraryManager, IChannelManager channelManager, IMediaSourceManager mediaSourceManager)
{
_logger = logger;
_liveTvManager = liveTvManager;
_libraryManager = libraryManager;
_channelManager = channelManager;
+ _mediaSourceManager = mediaSourceManager;
}
public async Task<EncodingJob> CreateJob(EncodingJobOptions options, bool isVideoRequest, IProgress<double> progress, CancellationToken cancellationToken)
@@ -71,10 +72,10 @@ namespace MediaBrowser.MediaEncoding.Encoder
var path = recording.RecordingInfo.Path;
var mediaUrl = recording.RecordingInfo.Url;
-
+
var source = string.IsNullOrEmpty(request.MediaSourceId)
? recording.GetMediaSources(false).First()
- : recording.GetMediaSources(false).First(i => string.Equals(i.Id, request.MediaSourceId));
+ : _mediaSourceManager.GetStaticMediaSource(recording, request.MediaSourceId, false);
mediaStreams = source.MediaStreams;
@@ -113,25 +114,13 @@ namespace MediaBrowser.MediaEncoding.Encoder
// Just to prevent this from being null and causing other methods to fail
state.MediaPath = string.Empty;
}
- else if (item is IChannelMediaItem)
- {
- var mediaSource = await GetChannelMediaInfo(request.ItemId, request.MediaSourceId, cancellationToken).ConfigureAwait(false);
- state.IsInputVideo = string.Equals(item.MediaType, MediaType.Video, StringComparison.OrdinalIgnoreCase);
- state.InputProtocol = mediaSource.Protocol;
- state.MediaPath = mediaSource.Path;
- state.RunTimeTicks = item.RunTimeTicks;
- state.RemoteHttpHeaders = mediaSource.RequiredHttpHeaders;
- state.InputBitrate = mediaSource.Bitrate;
- state.InputFileSize = mediaSource.Size;
- state.ReadInputAtNativeFramerate = mediaSource.ReadAtNativeFramerate;
- mediaStreams = mediaSource.MediaStreams;
- }
else
{
- var hasMediaSources = (IHasMediaSources)item;
+ var mediaSources = await _mediaSourceManager.GetPlayackMediaSources(request.ItemId, false, cancellationToken).ConfigureAwait(false);
+
var mediaSource = string.IsNullOrEmpty(request.MediaSourceId)
- ? hasMediaSources.GetMediaSources(false).First()
- : hasMediaSources.GetMediaSources(false).First(i => string.Equals(i.Id, request.MediaSourceId));
+ ? mediaSources.First()
+ : mediaSources.First(i => string.Equals(i.Id, request.MediaSourceId));
mediaStreams = mediaSource.MediaStreams;
@@ -141,6 +130,8 @@ namespace MediaBrowser.MediaEncoding.Encoder
state.InputFileSize = mediaSource.Size;
state.InputBitrate = mediaSource.Bitrate;
state.ReadInputAtNativeFramerate = mediaSource.ReadAtNativeFramerate;
+ state.RunTimeTicks = mediaSource.RunTimeTicks;
+ state.RemoteHttpHeaders = mediaSource.RequiredHttpHeaders;
var video = item as Video;
@@ -424,29 +415,6 @@ namespace MediaBrowser.MediaEncoding.Encoder
return bitrate;
}
- private async Task<MediaSourceInfo> GetChannelMediaInfo(string id,
- string mediaSourceId,
- CancellationToken cancellationToken)
- {
- var channelMediaSources = await _channelManager.GetChannelItemMediaSources(id, true, cancellationToken)
- .ConfigureAwait(false);
-
- var list = channelMediaSources.ToList();
-
- if (!string.IsNullOrWhiteSpace(mediaSourceId))
- {
- var source = list
- .FirstOrDefault(i => string.Equals(mediaSourceId, i.Id));
-
- if (source != null)
- {
- return source;
- }
- }
-
- return list.First();
- }
-
protected string GetVideoBitrateParam(EncodingJob state, string videoCodec, bool isHls)
{
var bitrate = state.OutputVideoBitrate;
diff --git a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
index b75d7bee3..7fd91bf6f 100644
--- a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
@@ -70,8 +70,9 @@ namespace MediaBrowser.MediaEncoding.Encoder
protected readonly IChannelManager ChannelManager;
protected readonly ISessionManager SessionManager;
protected readonly Func<ISubtitleEncoder> SubtitleEncoder;
+ protected readonly Func<IMediaSourceManager> MediaSourceManager;
- public MediaEncoder(ILogger logger, IJsonSerializer jsonSerializer, string ffMpegPath, string ffProbePath, string version, IServerConfigurationManager configurationManager, IFileSystem fileSystem, ILiveTvManager liveTvManager, IIsoManager isoManager, ILibraryManager libraryManager, IChannelManager channelManager, ISessionManager sessionManager, Func<ISubtitleEncoder> subtitleEncoder)
+ public MediaEncoder(ILogger logger, IJsonSerializer jsonSerializer, string ffMpegPath, string ffProbePath, string version, IServerConfigurationManager configurationManager, IFileSystem fileSystem, ILiveTvManager liveTvManager, IIsoManager isoManager, ILibraryManager libraryManager, IChannelManager channelManager, ISessionManager sessionManager, Func<ISubtitleEncoder> subtitleEncoder, Func<IMediaSourceManager> mediaSourceManager)
{
_logger = logger;
_jsonSerializer = jsonSerializer;
@@ -84,6 +85,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
ChannelManager = channelManager;
SessionManager = sessionManager;
SubtitleEncoder = subtitleEncoder;
+ MediaSourceManager = mediaSourceManager;
FFProbePath = ffProbePath;
FFMpegPath = ffMpegPath;
}
@@ -580,7 +582,8 @@ namespace MediaBrowser.MediaEncoding.Encoder
LibraryManager,
ChannelManager,
SessionManager,
- SubtitleEncoder())
+ SubtitleEncoder(),
+ MediaSourceManager())
.Start(options, progress, cancellationToken).ConfigureAwait(false);
await job.TaskCompletionSource.Task.ConfigureAwait(false);
@@ -601,7 +604,8 @@ namespace MediaBrowser.MediaEncoding.Encoder
LibraryManager,
ChannelManager,
SessionManager,
- SubtitleEncoder())
+ SubtitleEncoder(),
+ MediaSourceManager())
.Start(options, progress, cancellationToken).ConfigureAwait(false);
await job.TaskCompletionSource.Task.ConfigureAwait(false);
diff --git a/MediaBrowser.MediaEncoding/Encoder/VideoEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/VideoEncoder.cs
index 941649add..efd0bd909 100644
--- a/MediaBrowser.MediaEncoding/Encoder/VideoEncoder.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/VideoEncoder.cs
@@ -14,7 +14,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
{
public class VideoEncoder : BaseEncoder
{
- public VideoEncoder(MediaEncoder mediaEncoder, ILogger logger, IServerConfigurationManager configurationManager, IFileSystem fileSystem, ILiveTvManager liveTvManager, IIsoManager isoManager, ILibraryManager libraryManager, IChannelManager channelManager, ISessionManager sessionManager, ISubtitleEncoder subtitleEncoder) : base(mediaEncoder, logger, configurationManager, fileSystem, liveTvManager, isoManager, libraryManager, channelManager, sessionManager, subtitleEncoder)
+ public VideoEncoder(MediaEncoder mediaEncoder, ILogger logger, IServerConfigurationManager configurationManager, IFileSystem fileSystem, ILiveTvManager liveTvManager, IIsoManager isoManager, ILibraryManager libraryManager, IChannelManager channelManager, ISessionManager sessionManager, ISubtitleEncoder subtitleEncoder, IMediaSourceManager mediaSourceManager) : base(mediaEncoder, logger, configurationManager, fileSystem, liveTvManager, isoManager, libraryManager, channelManager, sessionManager, subtitleEncoder, mediaSourceManager)
{
}
diff --git a/MediaBrowser.MediaEncoding/Subtitles/AssParser.cs b/MediaBrowser.MediaEncoding/Subtitles/AssParser.cs
index f28944945..2a8c958b2 100644
--- a/MediaBrowser.MediaEncoding/Subtitles/AssParser.cs
+++ b/MediaBrowser.MediaEncoding/Subtitles/AssParser.cs
@@ -49,6 +49,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
trackInfo.TrackEvents.Add(subEvent);
}
}
+ RemoteNativeFormatting(trackInfo);
return trackInfo;
}
@@ -69,5 +70,50 @@ namespace MediaBrowser.MediaEncoding.Subtitles
};
return result;
}
+
+ /// <summary>
+ /// Credit: https://github.com/SubtitleEdit/subtitleedit/blob/master/src/Logic/SubtitleFormats/AdvancedSubStationAlpha.cs
+ /// </summary>
+ private void RemoteNativeFormatting(SubtitleTrackInfo subtitle)
+ {
+ foreach (var p in subtitle.TrackEvents)
+ {
+ int indexOfBegin = p.Text.IndexOf('{');
+ string pre = string.Empty;
+ while (indexOfBegin >= 0 && p.Text.IndexOf('}') > indexOfBegin)
+ {
+ string s = p.Text.Substring(indexOfBegin);
+ if (s.StartsWith("{\\an1}", StringComparison.Ordinal) ||
+ s.StartsWith("{\\an2}", StringComparison.Ordinal) ||
+ s.StartsWith("{\\an3}", StringComparison.Ordinal) ||
+ s.StartsWith("{\\an4}", StringComparison.Ordinal) ||
+ s.StartsWith("{\\an5}", StringComparison.Ordinal) ||
+ s.StartsWith("{\\an6}", StringComparison.Ordinal) ||
+ s.StartsWith("{\\an7}", StringComparison.Ordinal) ||
+ s.StartsWith("{\\an8}", StringComparison.Ordinal) ||
+ s.StartsWith("{\\an9}", StringComparison.Ordinal))
+ {
+ pre = s.Substring(0, 6);
+ }
+ else if (s.StartsWith("{\\an1\\", StringComparison.Ordinal) ||
+ s.StartsWith("{\\an2\\", StringComparison.Ordinal) ||
+ s.StartsWith("{\\an3\\", StringComparison.Ordinal) ||
+ s.StartsWith("{\\an4\\", StringComparison.Ordinal) ||
+ s.StartsWith("{\\an5\\", StringComparison.Ordinal) ||
+ s.StartsWith("{\\an6\\", StringComparison.Ordinal) ||
+ s.StartsWith("{\\an7\\", StringComparison.Ordinal) ||
+ s.StartsWith("{\\an8\\", StringComparison.Ordinal) ||
+ s.StartsWith("{\\an9\\", StringComparison.Ordinal))
+ {
+ pre = s.Substring(0, 5) + "}";
+ }
+ int indexOfEnd = p.Text.IndexOf('}');
+ p.Text = p.Text.Remove(indexOfBegin, (indexOfEnd - indexOfBegin) + 1);
+
+ indexOfBegin = p.Text.IndexOf('{');
+ }
+ p.Text = pre + p.Text;
+ }
+ }
}
}
diff --git a/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs b/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs
index b9cad27e0..7d74c51ba 100644
--- a/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs
+++ b/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs
@@ -773,7 +773,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
{
try
{
- using (var file = new FileStream(path, FileMode.Open))
+ using (var file = _fileSystem.GetFileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
var detector = new CharsetDetector();
detector.Feed(file);
@@ -797,12 +797,12 @@ namespace MediaBrowser.MediaEncoding.Subtitles
return null;
}
- private static Encoding GetFileEncoding(string srcFile)
+ private Encoding GetFileEncoding(string srcFile)
{
// *** Detect byte order mark if any - otherwise assume default
var buffer = new byte[5];
- using (var file = new FileStream(srcFile, FileMode.Open))
+ using (var file = _fileSystem.GetFileStream(srcFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
file.Read(buffer, 0, 5);
}