mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-04-20 00:55:13 +01:00
probe live streams after opening
This commit is contained in:
@@ -44,7 +44,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
|
||||
public string Name
|
||||
{
|
||||
get { return "App Sync"; }
|
||||
get { return "Mobile Sync"; }
|
||||
}
|
||||
|
||||
public IEnumerable<SyncTarget> GetAllSyncTargets()
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
using System.Globalization;
|
||||
using MediaBrowser.Common.Configuration;
|
||||
using MediaBrowser.Common.IO;
|
||||
using MediaBrowser.Common.Progress;
|
||||
using MediaBrowser.Controller;
|
||||
using MediaBrowser.Controller.IO;
|
||||
using MediaBrowser.Controller.Sync;
|
||||
using MediaBrowser.Model.Dto;
|
||||
using MediaBrowser.Model.Entities;
|
||||
@@ -25,13 +27,15 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
private readonly IServerApplicationHost _appHost;
|
||||
private readonly ILogger _logger;
|
||||
private readonly IFileSystem _fileSystem;
|
||||
private readonly IConfigurationManager _config;
|
||||
|
||||
public MediaSync(ILogger logger, ISyncManager syncManager, IServerApplicationHost appHost, IFileSystem fileSystem)
|
||||
public MediaSync(ILogger logger, ISyncManager syncManager, IServerApplicationHost appHost, IFileSystem fileSystem, IConfigurationManager config)
|
||||
{
|
||||
_logger = logger;
|
||||
_syncManager = syncManager;
|
||||
_appHost = appHost;
|
||||
_fileSystem = fileSystem;
|
||||
_config = config;
|
||||
}
|
||||
|
||||
public async Task Sync(IServerSyncProvider provider,
|
||||
@@ -152,12 +156,14 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
var transferSuccess = false;
|
||||
Exception transferException = null;
|
||||
|
||||
var options = _config.GetSyncOptions();
|
||||
|
||||
try
|
||||
{
|
||||
var fileTransferProgress = new ActionableProgress<double>();
|
||||
fileTransferProgress.RegisterAction(pct => progress.Report(pct * .92));
|
||||
|
||||
var sendFileResult = await SendFile(provider, internalSyncJobItem.OutputPath, localItem.LocalPath, target, fileTransferProgress, cancellationToken).ConfigureAwait(false);
|
||||
var sendFileResult = await SendFile(provider, internalSyncJobItem.OutputPath, localItem.LocalPath, target, options, fileTransferProgress, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
if (localItem.Item.MediaSources != null)
|
||||
{
|
||||
@@ -179,7 +185,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
var mediaSource = localItem.Item.MediaSources.FirstOrDefault();
|
||||
if (mediaSource != null)
|
||||
{
|
||||
await SendSubtitles(localItem, mediaSource, provider, dataProvider, target, cancellationToken).ConfigureAwait(false);
|
||||
await SendSubtitles(localItem, mediaSource, provider, dataProvider, target, options, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -207,7 +213,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
}
|
||||
}
|
||||
|
||||
private async Task SendSubtitles(LocalItem localItem, MediaSourceInfo mediaSource, IServerSyncProvider provider, ISyncDataProvider dataProvider, SyncTarget target, CancellationToken cancellationToken)
|
||||
private async Task SendSubtitles(LocalItem localItem, MediaSourceInfo mediaSource, IServerSyncProvider provider, ISyncDataProvider dataProvider, SyncTarget target, SyncOptions options, CancellationToken cancellationToken)
|
||||
{
|
||||
var failedSubtitles = new List<MediaStream>();
|
||||
var requiresSave = false;
|
||||
@@ -219,7 +225,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
try
|
||||
{
|
||||
var remotePath = GetRemoteSubtitlePath(localItem, mediaStream, provider, target);
|
||||
var sendFileResult = await SendFile(provider, mediaStream.Path, remotePath, target, new Progress<double>(), cancellationToken).ConfigureAwait(false);
|
||||
var sendFileResult = await SendFile(provider, mediaStream.Path, remotePath, target, options, new Progress<double>(), cancellationToken).ConfigureAwait(false);
|
||||
|
||||
// This is the path that will be used when talking to the provider
|
||||
mediaStream.ExternalId = remotePath;
|
||||
@@ -307,11 +313,18 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<SyncedFileInfo> SendFile(IServerSyncProvider provider, string inputPath, string remotePath, SyncTarget target, IProgress<double> progress, CancellationToken cancellationToken)
|
||||
private async Task<SyncedFileInfo> SendFile(IServerSyncProvider provider, string inputPath, string remotePath, SyncTarget target, SyncOptions options, IProgress<double> progress, CancellationToken cancellationToken)
|
||||
{
|
||||
_logger.Debug("Sending {0} to {1}. Remote path: {2}", inputPath, provider.Name, remotePath);
|
||||
using (var stream = _fileSystem.GetFileStream(inputPath, FileMode.Open, FileAccess.Read, FileShare.Read, true))
|
||||
using (var fileStream = _fileSystem.GetFileStream(inputPath, FileMode.Open, FileAccess.Read, FileShare.Read, true))
|
||||
{
|
||||
Stream stream = fileStream;
|
||||
|
||||
if (options.UploadSpeedLimitBytes > 0 && provider is IRemoteSyncProvider)
|
||||
{
|
||||
stream = new ThrottledStream(stream, options.UploadSpeedLimitBytes);
|
||||
}
|
||||
|
||||
return await provider.SendFile(stream, remotePath, target, progress, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using MediaBrowser.Common.IO;
|
||||
using MediaBrowser.Common.Configuration;
|
||||
using MediaBrowser.Common.IO;
|
||||
using MediaBrowser.Common.Progress;
|
||||
using MediaBrowser.Controller;
|
||||
using MediaBrowser.Controller.Sync;
|
||||
@@ -18,13 +19,15 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
private readonly IServerApplicationHost _appHost;
|
||||
private readonly ILogger _logger;
|
||||
private readonly IFileSystem _fileSystem;
|
||||
private readonly IConfigurationManager _config;
|
||||
|
||||
public MultiProviderSync(SyncManager syncManager, IServerApplicationHost appHost, ILogger logger, IFileSystem fileSystem)
|
||||
public MultiProviderSync(SyncManager syncManager, IServerApplicationHost appHost, ILogger logger, IFileSystem fileSystem, IConfigurationManager config)
|
||||
{
|
||||
_syncManager = syncManager;
|
||||
_appHost = appHost;
|
||||
_logger = logger;
|
||||
_fileSystem = fileSystem;
|
||||
_config = config;
|
||||
}
|
||||
|
||||
public async Task Sync(IEnumerable<IServerSyncProvider> providers, IProgress<double> progress, CancellationToken cancellationToken)
|
||||
@@ -56,7 +59,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
|
||||
var dataProvider = _syncManager.GetDataProvider(target.Item1, target.Item2);
|
||||
|
||||
await new MediaSync(_logger, _syncManager, _appHost, _fileSystem)
|
||||
await new MediaSync(_logger, _syncManager, _appHost, _fileSystem, _config)
|
||||
.Sync(target.Item1, dataProvider, target.Item2, innerProgress, cancellationToken)
|
||||
.ConfigureAwait(false);
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using MediaBrowser.Common.IO;
|
||||
using MediaBrowser.Common.Configuration;
|
||||
using MediaBrowser.Common.IO;
|
||||
using MediaBrowser.Common.ScheduledTasks;
|
||||
using MediaBrowser.Controller;
|
||||
using MediaBrowser.Controller.Sync;
|
||||
@@ -17,13 +18,15 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
private readonly ILogger _logger;
|
||||
private readonly IFileSystem _fileSystem;
|
||||
private readonly IServerApplicationHost _appHost;
|
||||
private readonly IConfigurationManager _config;
|
||||
|
||||
public ServerSyncScheduledTask(ISyncManager syncManager, ILogger logger, IFileSystem fileSystem, IServerApplicationHost appHost)
|
||||
public ServerSyncScheduledTask(ISyncManager syncManager, ILogger logger, IFileSystem fileSystem, IServerApplicationHost appHost, IConfigurationManager config)
|
||||
{
|
||||
_syncManager = syncManager;
|
||||
_logger = logger;
|
||||
_fileSystem = fileSystem;
|
||||
_appHost = appHost;
|
||||
_config = config;
|
||||
}
|
||||
|
||||
public string Name
|
||||
@@ -46,7 +49,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
|
||||
public Task Execute(CancellationToken cancellationToken, IProgress<double> progress)
|
||||
{
|
||||
return new MultiProviderSync((SyncManager)_syncManager, _appHost, _logger, _fileSystem)
|
||||
return new MultiProviderSync((SyncManager)_syncManager, _appHost, _logger, _fileSystem, _config)
|
||||
.Sync(ServerSyncProviders, progress, cancellationToken);
|
||||
}
|
||||
|
||||
|
||||
@@ -1167,6 +1167,11 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
}
|
||||
|
||||
public IEnumerable<SyncQualityOption> GetQualityOptions(string targetId)
|
||||
{
|
||||
return GetQualityOptions(targetId, null);
|
||||
}
|
||||
|
||||
public IEnumerable<SyncQualityOption> GetQualityOptions(string targetId, User user)
|
||||
{
|
||||
foreach (var provider in _providers)
|
||||
{
|
||||
@@ -1174,7 +1179,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
{
|
||||
if (string.Equals(target.Id, targetId, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return GetQualityOptions(provider, target);
|
||||
return GetQualityOptions(provider, target, user);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1182,12 +1187,19 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
return new List<SyncQualityOption>();
|
||||
}
|
||||
|
||||
private IEnumerable<SyncQualityOption> GetQualityOptions(ISyncProvider provider, SyncTarget target)
|
||||
private IEnumerable<SyncQualityOption> GetQualityOptions(ISyncProvider provider, SyncTarget target, User user)
|
||||
{
|
||||
var hasQuality = provider as IHasSyncQuality;
|
||||
if (hasQuality != null)
|
||||
{
|
||||
return hasQuality.GetQualityOptions(target);
|
||||
var options = hasQuality.GetQualityOptions(target);
|
||||
|
||||
if (user != null && !user.Policy.EnableSyncTranscoding)
|
||||
{
|
||||
options = options.Where(i => i.IsOriginalQuality);
|
||||
}
|
||||
|
||||
return options;
|
||||
}
|
||||
|
||||
// Default options for providers that don't override
|
||||
@@ -1217,7 +1229,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
};
|
||||
}
|
||||
|
||||
public IEnumerable<SyncProfileOption> GetProfileOptions(string targetId)
|
||||
public IEnumerable<SyncProfileOption> GetProfileOptions(string targetId, User user)
|
||||
{
|
||||
foreach (var provider in _providers)
|
||||
{
|
||||
@@ -1225,7 +1237,7 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
{
|
||||
if (string.Equals(target.Id, targetId, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return GetProfileOptions(provider, target);
|
||||
return GetProfileOptions(provider, target, user);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1233,7 +1245,12 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
return new List<SyncProfileOption>();
|
||||
}
|
||||
|
||||
private IEnumerable<SyncProfileOption> GetProfileOptions(ISyncProvider provider, SyncTarget target)
|
||||
public IEnumerable<SyncProfileOption> GetProfileOptions(string targetId)
|
||||
{
|
||||
return GetProfileOptions(targetId, null);
|
||||
}
|
||||
|
||||
private IEnumerable<SyncProfileOption> GetProfileOptions(ISyncProvider provider, SyncTarget target, User user)
|
||||
{
|
||||
var hasQuality = provider as IHasSyncQuality;
|
||||
if (hasQuality != null)
|
||||
@@ -1251,20 +1268,23 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||
EnableQualityOptions = false
|
||||
});
|
||||
|
||||
list.Add(new SyncProfileOption
|
||||
if (user == null || user.Policy.EnableSyncTranscoding)
|
||||
{
|
||||
Name = "Baseline",
|
||||
Id = "baseline",
|
||||
Description = "Designed for compatibility with all devices, including web browsers. Targets H264/AAC video and MP3 audio."
|
||||
});
|
||||
list.Add(new SyncProfileOption
|
||||
{
|
||||
Name = "Baseline",
|
||||
Id = "baseline",
|
||||
Description = "Designed for compatibility with all devices, including web browsers. Targets H264/AAC video and MP3 audio."
|
||||
});
|
||||
|
||||
list.Add(new SyncProfileOption
|
||||
{
|
||||
Name = "General",
|
||||
Id = "general",
|
||||
Description = "Designed for compatibility with Chromecast, Roku, Smart TV's, and other similar devices. Targets H264/AAC/AC3 video and MP3 audio.",
|
||||
IsDefault = true
|
||||
});
|
||||
list.Add(new SyncProfileOption
|
||||
{
|
||||
Name = "General",
|
||||
Id = "general",
|
||||
Description = "Designed for compatibility with Chromecast, Roku, Smart TV's, and other similar devices. Targets H264/AAC/AC3 video and MP3 audio.",
|
||||
IsDefault = true
|
||||
});
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user