diff --git a/MediaBrowser.Dlna/Server/DescriptionXmlBuilder.cs b/MediaBrowser.Dlna/Server/DescriptionXmlBuilder.cs index de6b821836..47c10ac2c9 100644 --- a/MediaBrowser.Dlna/Server/DescriptionXmlBuilder.cs +++ b/MediaBrowser.Dlna/Server/DescriptionXmlBuilder.cs @@ -33,6 +33,11 @@ namespace MediaBrowser.Dlna.Server _serverAddress = serverAddress; } + private bool AbsoluteUrls + { + get { return true; } + } + public string GetXml() { var builder = new StringBuilder(); @@ -86,7 +91,10 @@ namespace MediaBrowser.Dlna.Server builder.Append("" + SecurityElement.Escape(_profile.ModelUrl ?? string.Empty) + ""); builder.Append("" + SecurityElement.Escape(_profile.SerialNumber ?? string.Empty) + ""); - builder.Append("" + SecurityElement.Escape(_serverAddress) + ""); + if (!AbsoluteUrls) + { + builder.Append("" + SecurityElement.Escape(_serverAddress) + ""); + } if (!string.IsNullOrWhiteSpace(_profile.SonyAggregationFlags)) { @@ -144,7 +152,11 @@ namespace MediaBrowser.Dlna.Server url = url.TrimStart('/'); url = "/dlna/" + _serverUdn + "/" + url; - //url = _serverAddress.TrimEnd('/') + url; + + if (AbsoluteUrls) + { + url = _serverAddress.TrimEnd('/') + url; + } return SecurityElement.Escape(url); } diff --git a/MediaBrowser.Model/ApiClient/ServerInfo.cs b/MediaBrowser.Model/ApiClient/ServerInfo.cs index 2faa5b4073..dcd5e75b19 100644 --- a/MediaBrowser.Model/ApiClient/ServerInfo.cs +++ b/MediaBrowser.Model/ApiClient/ServerInfo.cs @@ -92,7 +92,7 @@ namespace MediaBrowser.Model.ApiClient var existing = list[index]; // Merge the data - existing.IsOffline = user.IsOffline; + existing.IsSignedInOffline = user.IsSignedInOffline; } else { diff --git a/MediaBrowser.Model/ApiClient/ServerUserInfo.cs b/MediaBrowser.Model/ApiClient/ServerUserInfo.cs index 43186c86d6..812da7402c 100644 --- a/MediaBrowser.Model/ApiClient/ServerUserInfo.cs +++ b/MediaBrowser.Model/ApiClient/ServerUserInfo.cs @@ -4,6 +4,6 @@ namespace MediaBrowser.Model.ApiClient public class ServerUserInfo { public string Id { get; set; } - public bool IsOffline { get; set; } + public bool IsSignedInOffline { get; set; } } } diff --git a/MediaBrowser.Model/Dto/UserDto.cs b/MediaBrowser.Model/Dto/UserDto.cs index 22428fadd2..c66b34150d 100644 --- a/MediaBrowser.Model/Dto/UserDto.cs +++ b/MediaBrowser.Model/Dto/UserDto.cs @@ -26,7 +26,14 @@ namespace MediaBrowser.Model.Dto /// /// The server identifier. public string ServerId { get; set; } - + + /// + /// Gets or sets the name of the server. + /// This is not used by the server and is for client-side usage only. + /// + /// The name of the server. + public string ServerName { get; set; } + /// /// Gets or sets the name of the connect user. /// diff --git a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs index 0611e415d8..0e70507413 100644 --- a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs +++ b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs @@ -170,7 +170,7 @@ namespace MediaBrowser.Providers.BoxSets url += string.Format("&language={0}", language); } - var includeImageLanguageParam = MovieDbProvider.GetImageLanguagesParam(_localization, language); + var includeImageLanguageParam = MovieDbProvider.GetImageLanguagesParam(language); // Get images in english and with no language url += "&include_image_language=" + includeImageLanguageParam; diff --git a/MediaBrowser.Providers/Movies/MovieDbProvider.cs b/MediaBrowser.Providers/Movies/MovieDbProvider.cs index b4d7b14dcd..ed15a2eeff 100644 --- a/MediaBrowser.Providers/Movies/MovieDbProvider.cs +++ b/MediaBrowser.Providers/Movies/MovieDbProvider.cs @@ -16,7 +16,6 @@ using System; using System.Collections.Generic; using System.Globalization; using System.IO; -using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -263,7 +262,7 @@ namespace MediaBrowser.Providers.Movies return Path.Combine(path, filename); } - public static string GetImageLanguagesParam(ILocalizationManager localization, string preferredLanguage) + public static string GetImageLanguagesParam(string preferredLanguage) { var languages = new List(); @@ -277,18 +276,6 @@ namespace MediaBrowser.Providers.Movies languages.Add("en"); } - var firstLetter = string.IsNullOrWhiteSpace(preferredLanguage) - ? string.Empty - : preferredLanguage.Substring(0, 1); - - var allLanguages = localization.GetCultures() - .Select(i => i.TwoLetterISOLanguageName) - .Distinct(StringComparer.OrdinalIgnoreCase) - .Where(i => !languages.Contains(i, StringComparer.OrdinalIgnoreCase) && i.StartsWith(firstLetter, StringComparison.OrdinalIgnoreCase)) - .ToList(); - - //languages.AddRange(allLanguages); - return string.Join(",", languages.ToArray()); } @@ -309,7 +296,7 @@ namespace MediaBrowser.Providers.Movies url += string.Format("&language={0}", language); } - var includeImageLanguageParam = GetImageLanguagesParam(_localization, language); + var includeImageLanguageParam = GetImageLanguagesParam(language); // Get images in english and with no language url += "&include_image_language=" + includeImageLanguageParam; @@ -336,26 +323,29 @@ namespace MediaBrowser.Providers.Movies cancellationToken.ThrowIfCancellationRequested(); - if (mainResult != null && string.IsNullOrEmpty(mainResult.overview)) + // If the language preference isn't english, then have the overview fallback to english if it's blank + if (mainResult != null && + string.IsNullOrEmpty(mainResult.overview) && + !string.IsNullOrEmpty(language) && + !string.Equals(language, "en", StringComparison.OrdinalIgnoreCase)) { - if (!string.IsNullOrEmpty(language) && !string.Equals(language, "en", StringComparison.OrdinalIgnoreCase)) + _logger.Info("MovieDbProvider couldn't find meta for language " + language + ". Trying English..."); + + url = string.Format(GetMovieInfo3, id, ApiKey) + "&include_image_language=" + includeImageLanguageParam + "&language=en"; + + using (var json = await GetMovieDbResponse(new HttpRequestOptions { - _logger.Info("MovieDbProvider couldn't find meta for language " + language + ". Trying English..."); + Url = url, + CancellationToken = cancellationToken, + AcceptHeader = AcceptHeader, + CacheMode = cacheMode, + CacheLength = cacheLength - url = string.Format(GetMovieInfo3, id, ApiKey) + "&include_image_language=" + includeImageLanguageParam + "&language=en"; + }).ConfigureAwait(false)) + { + var englishResult = _jsonSerializer.DeserializeFromStream(json); - using (var json = await GetMovieDbResponse(new HttpRequestOptions - { - Url = url, - CancellationToken = cancellationToken, - AcceptHeader = AcceptHeader, - CacheMode = cacheMode, - CacheLength = cacheLength - - }).ConfigureAwait(false)) - { - mainResult = _jsonSerializer.DeserializeFromStream(json); - } + mainResult.overview = englishResult.overview; } } diff --git a/MediaBrowser.Providers/TV/MovieDbEpisodeImageProvider.cs b/MediaBrowser.Providers/TV/MovieDbEpisodeImageProvider.cs index 6aa27f4968..ff5e6025df 100644 --- a/MediaBrowser.Providers/TV/MovieDbEpisodeImageProvider.cs +++ b/MediaBrowser.Providers/TV/MovieDbEpisodeImageProvider.cs @@ -219,7 +219,7 @@ namespace MediaBrowser.Providers.TV url += string.Format("&language={0}", language); } - var includeImageLanguageParam = MovieDbProvider.GetImageLanguagesParam(_localization, language); + var includeImageLanguageParam = MovieDbProvider.GetImageLanguagesParam(language); // Get images in english and with no language url += "&include_image_language=" + includeImageLanguageParam; diff --git a/MediaBrowser.Providers/TV/MovieDbSeasonProvider.cs b/MediaBrowser.Providers/TV/MovieDbSeasonProvider.cs index 80f4c9485e..44c36af8fc 100644 --- a/MediaBrowser.Providers/TV/MovieDbSeasonProvider.cs +++ b/MediaBrowser.Providers/TV/MovieDbSeasonProvider.cs @@ -203,7 +203,7 @@ namespace MediaBrowser.Providers.TV url += string.Format("&language={0}", language); } - var includeImageLanguageParam = MovieDbProvider.GetImageLanguagesParam(_localization, language); + var includeImageLanguageParam = MovieDbProvider.GetImageLanguagesParam(language); // Get images in english and with no language url += "&include_image_language=" + includeImageLanguageParam; diff --git a/MediaBrowser.Providers/TV/MovieDbSeriesProvider.cs b/MediaBrowser.Providers/TV/MovieDbSeriesProvider.cs index 0fcbab1691..28fee246b7 100644 --- a/MediaBrowser.Providers/TV/MovieDbSeriesProvider.cs +++ b/MediaBrowser.Providers/TV/MovieDbSeriesProvider.cs @@ -62,7 +62,7 @@ namespace MediaBrowser.Providers.TV cancellationToken.ThrowIfCancellationRequested(); await EnsureSeriesInfo(tmdbId, searchInfo.MetadataLanguage, cancellationToken).ConfigureAwait(false); - + var dataFilePath = GetDataFilePath(tmdbId, searchInfo.MetadataLanguage); var obj = _jsonSerializer.DeserializeFromFile(dataFilePath); @@ -84,7 +84,7 @@ namespace MediaBrowser.Providers.TV { remoteResult.SetProviderId(MetadataProviders.Tvdb, obj.external_ids.tvdb_id.ToString(_usCulture)); } - + return new[] { remoteResult }; } @@ -233,7 +233,7 @@ namespace MediaBrowser.Providers.TV } series.HomePageUrl = seriesInfo.homepage; - + series.RunTimeTicks = seriesInfo.episode_run_time.Select(i => TimeSpan.FromMinutes(i).Ticks).FirstOrDefault(); if (string.Equals(seriesInfo.status, "Ended", StringComparison.OrdinalIgnoreCase)) @@ -302,12 +302,14 @@ namespace MediaBrowser.Providers.TV url += string.Format("&language={0}", language); } - var includeImageLanguageParam = MovieDbProvider.GetImageLanguagesParam(_localization, language); + var includeImageLanguageParam = MovieDbProvider.GetImageLanguagesParam(language); // Get images in english and with no language url += "&include_image_language=" + includeImageLanguageParam; cancellationToken.ThrowIfCancellationRequested(); + RootObject mainResult; + using (var json = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions { Url = url, @@ -316,8 +318,36 @@ namespace MediaBrowser.Providers.TV }).ConfigureAwait(false)) { - return _jsonSerializer.DeserializeFromStream(json); + mainResult = _jsonSerializer.DeserializeFromStream(json); } + + cancellationToken.ThrowIfCancellationRequested(); + + // If the language preference isn't english, then have the overview fallback to english if it's blank + if (mainResult != null && + string.IsNullOrEmpty(mainResult.overview) && + !string.IsNullOrEmpty(language) && + !string.Equals(language, "en", StringComparison.OrdinalIgnoreCase)) + { + _logger.Info("MovieDbSeriesProvider couldn't find meta for language " + language + ". Trying English..."); + + url = string.Format(GetTvInfo3, id, MovieDbProvider.ApiKey) + "&include_image_language=" + includeImageLanguageParam + "&language=en"; + + using (var json = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions + { + Url = url, + CancellationToken = cancellationToken, + AcceptHeader = MovieDbProvider.AcceptHeader + + }).ConfigureAwait(false)) + { + var englishResult = _jsonSerializer.DeserializeFromStream(json); + + mainResult.overview = englishResult.overview; + } + } + + return mainResult; } private readonly Task _cachedTask = Task.FromResult(true); diff --git a/MediaBrowser.Server.Implementations/Library/UserManager.cs b/MediaBrowser.Server.Implementations/Library/UserManager.cs index 09f060a46a..37f7e31fa6 100644 --- a/MediaBrowser.Server.Implementations/Library/UserManager.cs +++ b/MediaBrowser.Server.Implementations/Library/UserManager.cs @@ -412,6 +412,8 @@ namespace MediaBrowser.Server.Implementations.Library // Hash the pin with the device Id to create a unique result for this device dto.OfflinePassword = GetSha1String(offlinePasswordHash + deviceId); + dto.ServerName = _appHost.FriendlyName; + return dto; }