2016-09-29 12:55:49 +00:00
|
|
|
|
using System;
|
2016-10-10 18:18:28 +00:00
|
|
|
|
using System.Collections.Generic;
|
2017-05-22 04:54:02 +00:00
|
|
|
|
using System.IO;
|
2016-09-29 12:55:49 +00:00
|
|
|
|
using System.Threading;
|
2016-09-25 18:39:13 +00:00
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using MediaBrowser.Model.Dto;
|
2017-05-22 04:54:02 +00:00
|
|
|
|
using MediaBrowser.Model.IO;
|
|
|
|
|
using MediaBrowser.Model.System;
|
2016-09-25 18:39:13 +00:00
|
|
|
|
|
|
|
|
|
namespace MediaBrowser.Controller.LiveTv
|
|
|
|
|
{
|
|
|
|
|
public class LiveStream
|
|
|
|
|
{
|
|
|
|
|
public MediaSourceInfo OriginalMediaSource { get; set; }
|
2016-09-29 12:55:49 +00:00
|
|
|
|
public MediaSourceInfo OpenedMediaSource { get; set; }
|
2017-05-22 04:54:02 +00:00
|
|
|
|
public int ConsumerCount
|
|
|
|
|
{
|
2016-10-10 18:18:28 +00:00
|
|
|
|
get { return SharedStreamIds.Count; }
|
|
|
|
|
}
|
2016-09-29 12:55:49 +00:00
|
|
|
|
public ITunerHost TunerHost { get; set; }
|
|
|
|
|
public string OriginalStreamId { get; set; }
|
2016-09-30 06:50:06 +00:00
|
|
|
|
public bool EnableStreamSharing { get; set; }
|
2016-10-07 15:08:13 +00:00
|
|
|
|
public string UniqueId = Guid.NewGuid().ToString("N");
|
2016-09-25 18:39:13 +00:00
|
|
|
|
|
2017-05-22 04:54:02 +00:00
|
|
|
|
public List<string> SharedStreamIds = new List<string>();
|
|
|
|
|
protected readonly IEnvironmentInfo Environment;
|
|
|
|
|
protected readonly IFileSystem FileSystem;
|
|
|
|
|
const int StreamCopyToBufferSize = 81920;
|
2016-10-10 18:18:28 +00:00
|
|
|
|
|
2017-05-22 04:54:02 +00:00
|
|
|
|
public LiveStream(MediaSourceInfo mediaSource, IEnvironmentInfo environment, IFileSystem fileSystem)
|
2016-09-25 18:39:13 +00:00
|
|
|
|
{
|
|
|
|
|
OriginalMediaSource = mediaSource;
|
2017-05-22 04:54:02 +00:00
|
|
|
|
Environment = environment;
|
|
|
|
|
FileSystem = fileSystem;
|
2016-09-29 12:55:49 +00:00
|
|
|
|
OpenedMediaSource = mediaSource;
|
2016-09-30 06:50:06 +00:00
|
|
|
|
EnableStreamSharing = true;
|
2016-09-25 18:39:13 +00:00
|
|
|
|
}
|
|
|
|
|
|
2016-10-10 18:18:28 +00:00
|
|
|
|
public Task Open(CancellationToken cancellationToken)
|
2016-09-29 12:55:49 +00:00
|
|
|
|
{
|
2016-10-10 18:18:28 +00:00
|
|
|
|
return OpenInternal(cancellationToken);
|
2016-09-29 12:55:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected virtual Task OpenInternal(CancellationToken cancellationToken)
|
2016-09-25 18:39:13 +00:00
|
|
|
|
{
|
|
|
|
|
return Task.FromResult(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public virtual Task Close()
|
|
|
|
|
{
|
|
|
|
|
return Task.FromResult(true);
|
|
|
|
|
}
|
2017-05-22 04:54:02 +00:00
|
|
|
|
|
2017-05-25 13:00:14 +00:00
|
|
|
|
protected Stream GetInputStream(string path, long startPosition, bool allowAsyncFileRead)
|
2017-05-22 04:54:02 +00:00
|
|
|
|
{
|
2017-06-01 04:51:43 +00:00
|
|
|
|
var fileOpenOptions = FileOpenOptions.SequentialScan;
|
2017-05-22 04:54:02 +00:00
|
|
|
|
|
|
|
|
|
if (allowAsyncFileRead)
|
|
|
|
|
{
|
|
|
|
|
fileOpenOptions |= FileOpenOptions.Asynchronous;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return FileSystem.GetFileStream(path, FileOpenMode.Open, FileAccessMode.Read, FileShareMode.ReadWrite, fileOpenOptions);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected async Task DeleteTempFile(string path, int retryCount = 0)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
FileSystem.DeleteFile(path);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (retryCount > 20)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await Task.Delay(500).ConfigureAwait(false);
|
|
|
|
|
await DeleteTempFile(path, retryCount + 1).ConfigureAwait(false);
|
|
|
|
|
}
|
2016-09-25 18:39:13 +00:00
|
|
|
|
}
|
|
|
|
|
}
|