update subtitle downloading to use local metadata settings

This commit is contained in:
Luke Pulverenti 2017-11-08 15:23:39 -05:00
parent 50d322cbb7
commit 25138bbeb7
6 changed files with 204 additions and 29 deletions

View File

@ -105,7 +105,6 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
private class HdHomerunChannelInfo : ChannelInfo private class HdHomerunChannelInfo : ChannelInfo
{ {
public bool IsLegacyTuner { get; set; } public bool IsLegacyTuner { get; set; }
public string Url { get; set; }
} }
protected override async Task<List<ChannelInfo>> GetChannelsInternal(TunerHostInfo info, CancellationToken cancellationToken) protected override async Task<List<ChannelInfo>> GetChannelsInternal(TunerHostInfo info, CancellationToken cancellationToken)
@ -124,7 +123,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
VideoCodec = i.VideoCodec, VideoCodec = i.VideoCodec,
ChannelType = ChannelType.TV, ChannelType = ChannelType.TV,
IsLegacyTuner = (i.URL ?? string.Empty).StartsWith("hdhomerun", StringComparison.OrdinalIgnoreCase), IsLegacyTuner = (i.URL ?? string.Empty).StartsWith("hdhomerun", StringComparison.OrdinalIgnoreCase),
Url = i.URL Path = i.URL
}).Cast<ChannelInfo>().ToList(); }).Cast<ChannelInfo>().ToList();
} }
@ -148,7 +147,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
{ {
using (var response = await _httpClient.SendAsync(new HttpRequestOptions() using (var response = await _httpClient.SendAsync(new HttpRequestOptions()
{ {
Url = string.Format("{0}/discover.json", GetApiUrl(info, false)), Url = string.Format("{0}/discover.json", GetApiUrl(info)),
CancellationToken = cancellationToken, CancellationToken = cancellationToken,
TimeoutMs = Convert.ToInt32(TimeSpan.FromSeconds(5).TotalMilliseconds), TimeoutMs = Convert.ToInt32(TimeSpan.FromSeconds(5).TotalMilliseconds),
BufferContent = false BufferContent = false
@ -195,13 +194,80 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
} }
} }
private async Task<List<LiveTvTunerInfo>> GetTunerInfos(TunerHostInfo info, CancellationToken cancellationToken) private async Task<List<LiveTvTunerInfo>> GetTunerInfosHttp(TunerHostInfo info, CancellationToken cancellationToken)
{
var model = await GetModelInfo(info, false, cancellationToken).ConfigureAwait(false);
using (var stream = await _httpClient.Get(new HttpRequestOptions()
{
Url = string.Format("{0}/tuners.html", GetApiUrl(info)),
CancellationToken = cancellationToken,
TimeoutMs = Convert.ToInt32(TimeSpan.FromSeconds(5).TotalMilliseconds),
BufferContent = false
}))
{
var tuners = new List<LiveTvTunerInfo>();
using (var sr = new StreamReader(stream, System.Text.Encoding.UTF8))
{
while (!sr.EndOfStream)
{
string line = StripXML(sr.ReadLine());
if (line.Contains("Channel"))
{
LiveTvTunerStatus status;
var index = line.IndexOf("Channel", StringComparison.OrdinalIgnoreCase);
var name = line.Substring(0, index - 1);
var currentChannel = line.Substring(index + 7);
if (currentChannel != "none") { status = LiveTvTunerStatus.LiveTv; } else { status = LiveTvTunerStatus.Available; }
tuners.Add(new LiveTvTunerInfo
{
Name = name,
SourceType = string.IsNullOrWhiteSpace(model.ModelNumber) ? Name : model.ModelNumber,
ProgramName = currentChannel,
Status = status
});
}
}
}
return tuners;
}
}
private static string StripXML(string source)
{
char[] buffer = new char[source.Length];
int bufferIndex = 0;
bool inside = false;
for (int i = 0; i < source.Length; i++)
{
char let = source[i];
if (let == '<')
{
inside = true;
continue;
}
if (let == '>')
{
inside = false;
continue;
}
if (!inside)
{
buffer[bufferIndex] = let;
bufferIndex++;
}
}
return new string(buffer, 0, bufferIndex);
}
private async Task<List<LiveTvTunerInfo>> GetTunerInfosUdp(TunerHostInfo info, CancellationToken cancellationToken)
{ {
var model = await GetModelInfo(info, false, cancellationToken).ConfigureAwait(false); var model = await GetModelInfo(info, false, cancellationToken).ConfigureAwait(false);
var tuners = new List<LiveTvTunerInfo>(); var tuners = new List<LiveTvTunerInfo>();
var uri = new Uri(GetApiUrl(info, false)); var uri = new Uri(GetApiUrl(info));
using (var manager = new HdHomerunManager(_socketFactory, Logger)) using (var manager = new HdHomerunManager(_socketFactory, Logger))
{ {
@ -246,7 +312,22 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
return list; return list;
} }
private string GetApiUrl(TunerHostInfo info, bool isPlayback) public async Task<List<LiveTvTunerInfo>> GetTunerInfos(TunerHostInfo info, CancellationToken cancellationToken)
{
// TODO Need faster way to determine UDP vs HTTP
var channels = await GetChannels(info, true, cancellationToken);
var hdHomerunChannelInfo = channels.FirstOrDefault() as HdHomerunChannelInfo;
if (hdHomerunChannelInfo == null || hdHomerunChannelInfo.IsLegacyTuner)
{
return await GetTunerInfosUdp(info, cancellationToken).ConfigureAwait(false);
}
return await GetTunerInfosHttp(info, cancellationToken).ConfigureAwait(false);
}
private string GetApiUrl(TunerHostInfo info)
{ {
var url = info.Url; var url = info.Url;
@ -260,16 +341,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
url = "http://" + url; url = "http://" + url;
} }
var uri = new Uri(url); return new Uri(url).AbsoluteUri.TrimEnd('/');
if (isPlayback)
{
var builder = new UriBuilder(uri);
builder.Port = 5004;
uri = builder.Uri;
}
return uri.AbsoluteUri.TrimEnd('/');
} }
private class Channels private class Channels
@ -392,7 +464,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
nal = "0"; nal = "0";
} }
var url = GetApiUrl(info, false); var url = GetApiUrl(info);
var id = profile; var id = profile;
if (string.IsNullOrWhiteSpace(id)) if (string.IsNullOrWhiteSpace(id))
@ -526,7 +598,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
if (hdhomerunChannel != null && hdhomerunChannel.IsLegacyTuner) if (hdhomerunChannel != null && hdhomerunChannel.IsLegacyTuner)
{ {
return new HdHomerunUdpStream(mediaSource, streamId, new LegacyHdHomerunChannelCommands(hdhomerunChannel.Url), modelInfo.TunerCount, FileSystem, _httpClient, Logger, Config.ApplicationPaths, _appHost, _socketFactory, _networkManager, _environment); return new HdHomerunUdpStream(mediaSource, streamId, new LegacyHdHomerunChannelCommands(hdhomerunChannel.Path), modelInfo.TunerCount, FileSystem, _httpClient, Logger, Config.ApplicationPaths, _appHost, _socketFactory, _networkManager, _environment);
} }
// The UDP method is not working reliably on OSX, and on BSD it hasn't been tested yet // The UDP method is not working reliably on OSX, and on BSD it hasn't been tested yet
@ -537,7 +609,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
{ {
mediaSource.Protocol = MediaProtocol.Http; mediaSource.Protocol = MediaProtocol.Http;
var httpUrl = GetApiUrl(info, true) + "/auto/v" + hdhrId; var httpUrl = channelInfo.Path;
// If raw was used, the tuner doesn't support params // If raw was used, the tuner doesn't support params
if (!string.IsNullOrWhiteSpace(profile) && !string.Equals(profile, "native", StringComparison.OrdinalIgnoreCase)) if (!string.IsNullOrWhiteSpace(profile) && !string.Equals(profile, "native", StringComparison.OrdinalIgnoreCase))

View File

@ -9,6 +9,8 @@ using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using MediaBrowser.Controller.MediaEncoding; using MediaBrowser.Controller.MediaEncoding;
using MediaBrowser.Model.Services; using MediaBrowser.Model.Services;
using MediaBrowser.Common.Net;
using System.Threading;
namespace MediaBrowser.Api namespace MediaBrowser.Api
{ {
@ -50,14 +52,16 @@ namespace MediaBrowser.Api
private readonly IUserManager _userManager; private readonly IUserManager _userManager;
private readonly IConnectManager _connectManager; private readonly IConnectManager _connectManager;
private readonly IMediaEncoder _mediaEncoder; private readonly IMediaEncoder _mediaEncoder;
private readonly IHttpClient _httpClient;
public StartupWizardService(IServerConfigurationManager config, IServerApplicationHost appHost, IUserManager userManager, IConnectManager connectManager, IMediaEncoder mediaEncoder) public StartupWizardService(IServerConfigurationManager config, IHttpClient httpClient, IServerApplicationHost appHost, IUserManager userManager, IConnectManager connectManager, IMediaEncoder mediaEncoder)
{ {
_config = config; _config = config;
_appHost = appHost; _appHost = appHost;
_userManager = userManager; _userManager = userManager;
_connectManager = connectManager; _connectManager = connectManager;
_mediaEncoder = mediaEncoder; _mediaEncoder = mediaEncoder;
_httpClient = httpClient;
} }
public void Post(ReportStartupWizardComplete request) public void Post(ReportStartupWizardComplete request)
@ -65,6 +69,35 @@ namespace MediaBrowser.Api
_config.Configuration.IsStartupWizardCompleted = true; _config.Configuration.IsStartupWizardCompleted = true;
_config.SetOptimalValues(); _config.SetOptimalValues();
_config.SaveConfiguration(); _config.SaveConfiguration();
Task.Run(UpdateStats);
}
private async Task UpdateStats()
{
try
{
var url = string.Format("http://www.mb3admin.com/admin/service/package/installed?mac={0}&product=MBServer&operation=Install&version={1}",
_appHost.SystemId,
_appHost.ApplicationVersion.ToString());
using (var response = await _httpClient.SendAsync(new HttpRequestOptions
{
Url = url,
CancellationToken = CancellationToken.None,
LogErrors = false,
LogRequest = false
}, "GET").ConfigureAwait(false))
{
}
}
catch
{
}
} }
public object Get(GetStartupInfo request) public object Get(GetStartupInfo request)

View File

@ -45,14 +45,14 @@ namespace MediaBrowser.Model.Entities
public string DisplayTitle public string DisplayTitle
{ {
get get
{
if (Type == MediaStreamType.Audio)
{ {
if (!string.IsNullOrEmpty(Title)) if (!string.IsNullOrEmpty(Title))
{ {
return AddLanguageIfNeeded(Title); return AddLanguageIfNeeded(Title);
} }
if (Type == MediaStreamType.Audio)
{
List<string> attributes = new List<string>(); List<string> attributes = new List<string>();
if (!string.IsNullOrEmpty(Language)) if (!string.IsNullOrEmpty(Language))
@ -84,8 +84,32 @@ namespace MediaBrowser.Model.Entities
return string.Join(" ", attributes.ToArray(attributes.Count)); return string.Join(" ", attributes.ToArray(attributes.Count));
} }
if (Type == MediaStreamType.Video)
{
List<string> attributes = new List<string>();
var resolutionText = GetResolutionText();
if (!string.IsNullOrEmpty(resolutionText))
{
attributes.Add(resolutionText);
}
if (!string.IsNullOrEmpty(Codec))
{
attributes.Add(Codec.ToUpper());
}
return string.Join(" ", attributes.ToArray(attributes.Count));
}
if (Type == MediaStreamType.Subtitle) if (Type == MediaStreamType.Subtitle)
{ {
if (!string.IsNullOrEmpty(Title))
{
return AddLanguageIfNeeded(Title);
}
List<string> attributes = new List<string>(); List<string> attributes = new List<string>();
if (!string.IsNullOrEmpty(Language)) if (!string.IsNullOrEmpty(Language))
@ -121,6 +145,54 @@ namespace MediaBrowser.Model.Entities
} }
} }
private string GetResolutionText()
{
var i = this;
if (i.Width.HasValue)
{
if (i.Width >= 3800)
{
return "4K";
}
if (i.Width >= 2500)
{
if (i.IsInterlaced)
{
return "1440I";
}
return "1440P";
}
if (i.Width >= 1900)
{
if (i.IsInterlaced)
{
return "1080I";
}
return "1080P";
}
if (i.Width >= 1260)
{
if (i.IsInterlaced)
{
return "720I";
}
return "720P";
}
if (i.Width >= 700)
{
if (i.IsInterlaced)
{
return "480I";
}
return "480P";
}
}
return null;
}
private string AddLanguageIfNeeded(string title) private string AddLanguageIfNeeded(string title)
{ {
if (!string.IsNullOrEmpty(Language) && if (!string.IsNullOrEmpty(Language) &&

View File

@ -13,7 +13,6 @@ namespace MediaBrowser.Model.Providers
public bool IsOpenSubtitleVipAccount { get; set; } public bool IsOpenSubtitleVipAccount { get; set; }
public bool RequirePerfectMatch { get; set; } public bool RequirePerfectMatch { get; set; }
public bool SaveSubtitlesInMediaFolders { get; set; }
public SubtitleOptions() public SubtitleOptions()
{ {
@ -21,7 +20,6 @@ namespace MediaBrowser.Model.Providers
SkipIfAudioTrackMatches = true; SkipIfAudioTrackMatches = true;
RequirePerfectMatch = true; RequirePerfectMatch = true;
SaveSubtitlesInMediaFolders = true;
} }
} }
} }

View File

@ -116,7 +116,7 @@ namespace MediaBrowser.Providers.Subtitles
var parts = subtitleId.Split(new[] { '_' }, 2); var parts = subtitleId.Split(new[] { '_' }, 2);
var provider = GetProvider(parts.First()); var provider = GetProvider(parts.First());
var saveInMediaFolder = GetOptions().SaveSubtitlesInMediaFolders && video.SupportsLocalMetadata; var saveInMediaFolder = video.IsSaveLocalMetadataEnabled();
try try
{ {

View File

@ -1,3 +1,3 @@
using System.Reflection; using System.Reflection;
[assembly: AssemblyVersion("3.2.36.4")] [assembly: AssemblyVersion("3.2.36.5")]