|
|
|
@ -19,6 +19,7 @@ using System.Threading.Tasks;
|
|
|
|
|
using CommonIO;
|
|
|
|
|
using MediaBrowser.Api.Playback.Progressive;
|
|
|
|
|
using MediaBrowser.Controller.Configuration;
|
|
|
|
|
using MediaBrowser.Server.Implementations.LiveTv.EmbyTV;
|
|
|
|
|
|
|
|
|
|
namespace MediaBrowser.Api.LiveTv
|
|
|
|
|
{
|
|
|
|
@ -674,8 +675,6 @@ namespace MediaBrowser.Api.LiveTv
|
|
|
|
|
{
|
|
|
|
|
public string Id { get; set; }
|
|
|
|
|
public string Container { get; set; }
|
|
|
|
|
public long T { get; set; }
|
|
|
|
|
public long S { get; set; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class LiveTvService : BaseApiService
|
|
|
|
@ -699,45 +698,18 @@ namespace MediaBrowser.Api.LiveTv
|
|
|
|
|
_fileSystem = fileSystem;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public object Get(GetLiveStreamFile request)
|
|
|
|
|
public async Task<object> Get(GetLiveStreamFile request)
|
|
|
|
|
{
|
|
|
|
|
var filePath = Path.Combine(_config.ApplicationPaths.TranscodingTempPath, request.Id + ".ts");
|
|
|
|
|
|
|
|
|
|
var directStreamProvider = (await EmbyTV.Current.GetLiveStream(request.Id).ConfigureAwait(false)) as IDirectStreamProvider;
|
|
|
|
|
var outputHeaders = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
|
|
|
|
|
|
|
|
|
|
outputHeaders["Content-Type"] = MediaBrowser.Model.Net.MimeTypes.GetMimeType(filePath);
|
|
|
|
|
|
|
|
|
|
long startPosition = 0;
|
|
|
|
|
// TODO: Don't hardcode this
|
|
|
|
|
outputHeaders["Content-Type"] = Model.Net.MimeTypes.GetMimeType("file.ts");
|
|
|
|
|
|
|
|
|
|
if (request.T > 0)
|
|
|
|
|
var streamSource = new ProgressiveFileCopier(directStreamProvider, outputHeaders, null, Logger, CancellationToken.None)
|
|
|
|
|
{
|
|
|
|
|
var now = DateTime.UtcNow;
|
|
|
|
|
|
|
|
|
|
var totalTicks = now.Ticks - request.S;
|
|
|
|
|
|
|
|
|
|
if (totalTicks > 0)
|
|
|
|
|
{
|
|
|
|
|
double requestedOffset = request.T;
|
|
|
|
|
requestedOffset = Math.Max(0, requestedOffset - TimeSpan.FromSeconds(10).Ticks);
|
|
|
|
|
|
|
|
|
|
var pct = requestedOffset / totalTicks;
|
|
|
|
|
|
|
|
|
|
Logger.Info("Live stream offset pct {0}", pct);
|
|
|
|
|
|
|
|
|
|
var bytes = new FileInfo(filePath).Length;
|
|
|
|
|
Logger.Info("Live stream total bytes {0}", bytes);
|
|
|
|
|
startPosition = Convert.ToInt64(pct * bytes);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Logger.Info("Live stream starting byte position {0}", startPosition);
|
|
|
|
|
|
|
|
|
|
var streamSource = new ProgressiveFileCopier(_fileSystem, filePath, outputHeaders, null, Logger, CancellationToken.None)
|
|
|
|
|
{
|
|
|
|
|
AllowEndOfFile = false,
|
|
|
|
|
StartPosition = startPosition
|
|
|
|
|
AllowEndOfFile = false
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return ResultFactory.GetAsyncStreamWriter(streamSource);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|