From adcc104e258e17243fdbf6bc036d5cda7669dd61 Mon Sep 17 00:00:00 2001 From: softworkz Date: Sat, 25 Jun 2016 02:20:04 +0200 Subject: [PATCH 1/4] At least update names of container folders (originating from a Channel) --- .../Channels/ChannelManager.cs | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs index e01468d176..41592865c0 100644 --- a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs +++ b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs @@ -1320,20 +1320,14 @@ namespace MediaBrowser.Server.Implementations.Channels item.Tags = info.Tags; item.HomePageUrl = info.HomePageUrl; } - else + else if (info.Type == ChannelItemType.Folder && info.FolderType == ChannelFolderType.Container) { - // Can't do this right now due to channels that utilize the server's metadata services - //if (item.Name != info.Name) - //{ - // item.Name = info.Name; - // forceUpdate = true; - //} - - //if (item.CommunityRating != info.CommunityRating) - //{ - // item.CommunityRating = info.CommunityRating; - // forceUpdate = true; - //} + // At least update names of container folders + if (item.Name != info.Name) + { + item.Name = info.Name; + forceUpdate = true; + } } var hasArtists = item as IHasArtist; From 3709e6c12e6d50813d1ae281ef90700cff70b276 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 24 Jun 2016 20:29:39 -0400 Subject: [PATCH 2/4] update sidebar --- MediaBrowser.Api/UserLibrary/ItemsService.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs index a7fc646a9e..7dd5920b77 100644 --- a/MediaBrowser.Api/UserLibrary/ItemsService.cs +++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs @@ -48,11 +48,9 @@ namespace MediaBrowser.Api.UserLibrary /// /// The user manager. /// The library manager. - /// The user data repository. /// The localization. /// The dto service. - /// The collection manager. - public ItemsService(IUserManager userManager, ILibraryManager libraryManager, IUserDataManager userDataRepository, ILocalizationManager localization, IDtoService dtoService, ICollectionManager collectionManager) + public ItemsService(IUserManager userManager, ILibraryManager libraryManager, ILocalizationManager localization, IDtoService dtoService) { _userManager = userManager; _libraryManager = libraryManager; @@ -302,7 +300,7 @@ namespace MediaBrowser.Api.UserLibrary { query.LocationTypes = request.LocationTypes.Split(',').Select(d => (LocationType)Enum.Parse(typeof(LocationType), d, true)).ToArray(); } - + // Min official rating if (!string.IsNullOrWhiteSpace(request.MinOfficialRating)) { From 06f5af783b03810551c0e7a3049cf6c8602298bd Mon Sep 17 00:00:00 2001 From: softworkz Date: Sat, 25 Jun 2016 01:53:38 +0200 Subject: [PATCH 3/4] Adjust language for image results from TMDB when querying complex language codes (> 2 chars, qualified by country) --- .../BoxSets/MovieDbBoxSetImageProvider.cs | 2 +- .../Movies/MovieDbImageProvider.cs | 6 +-- .../Movies/MovieDbProvider.cs | 41 ++++++++++++++++--- .../TheMovieDb/MovieDbEpisodeImageProvider.cs | 6 ++- .../TV/TheMovieDb/MovieDbProviderBase.cs | 2 +- .../TheMovieDb/MovieDbSeriesImageProvider.cs | 6 +-- 6 files changed, 47 insertions(+), 16 deletions(-) diff --git a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetImageProvider.cs b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetImageProvider.cs index b3e73740d9..2dce13ebc3 100644 --- a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetImageProvider.cs +++ b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetImageProvider.cs @@ -83,7 +83,7 @@ namespace MediaBrowser.Providers.BoxSets VoteCount = i.vote_count, Width = i.width, Height = i.height, - Language = i.iso_639_1, + Language = MovieDbProvider.AdjustImageLanguage(i.iso_639_1, language), ProviderName = Name, Type = ImageType.Primary, RatingType = RatingType.Score diff --git a/MediaBrowser.Providers/Movies/MovieDbImageProvider.cs b/MediaBrowser.Providers/Movies/MovieDbImageProvider.cs index f9e9bc947f..49f341f26f 100644 --- a/MediaBrowser.Providers/Movies/MovieDbImageProvider.cs +++ b/MediaBrowser.Providers/Movies/MovieDbImageProvider.cs @@ -63,6 +63,8 @@ namespace MediaBrowser.Providers.Movies { var list = new List(); + var language = item.GetPreferredMetadataLanguage(); + var results = await FetchImages((BaseItem)item, null, _jsonSerializer, cancellationToken).ConfigureAwait(false); if (results == null) @@ -85,7 +87,7 @@ namespace MediaBrowser.Providers.Movies VoteCount = i.vote_count, Width = i.width, Height = i.height, - Language = i.iso_639_1, + Language = MovieDbProvider.AdjustImageLanguage(i.iso_639_1, language), ProviderName = Name, Type = ImageType.Primary, RatingType = RatingType.Score @@ -107,8 +109,6 @@ namespace MediaBrowser.Providers.Movies })); } - var language = item.GetPreferredMetadataLanguage(); - var isLanguageEn = string.Equals(language, "en", StringComparison.OrdinalIgnoreCase); return list.OrderByDescending(i => diff --git a/MediaBrowser.Providers/Movies/MovieDbProvider.cs b/MediaBrowser.Providers/Movies/MovieDbProvider.cs index 6a2e727439..27b61225bd 100644 --- a/MediaBrowser.Providers/Movies/MovieDbProvider.cs +++ b/MediaBrowser.Providers/Movies/MovieDbProvider.cs @@ -267,9 +267,21 @@ namespace MediaBrowser.Providers.Movies if (!string.IsNullOrEmpty(preferredLanguage)) { + preferredLanguage = NormalizeLanguage(preferredLanguage); + languages.Add(preferredLanguage); + + if (preferredLanguage.Length == 5) // like en-US + { + // Currenty, TMDB supports 2-letter language codes only + // They are planning to change this in the future, thus we're + // supplying both codes if we're having a 5-letter code. + languages.Add(preferredLanguage.Substring(0, 2)); + } } + languages.Add("null"); + if (!string.Equals(preferredLanguage, "en", StringComparison.OrdinalIgnoreCase)) { languages.Add("en"); @@ -280,18 +292,35 @@ namespace MediaBrowser.Providers.Movies public static string NormalizeLanguage(string language) { - // They require this to be uppercase - // https://emby.media/community/index.php?/topic/32454-fr-follow-tmdbs-new-language-api-update/?p=311148 - var parts = language.Split('-'); - - if (parts.Length == 2) + if (!string.IsNullOrEmpty(language)) { - language = parts[0] + "-" + parts[1].ToUpper(); + // They require this to be uppercase + // https://emby.media/community/index.php?/topic/32454-fr-follow-tmdbs-new-language-api-update/?p=311148 + var parts = language.Split('-'); + + if (parts.Length == 2) + { + language = parts[0] + "-" + parts[1].ToUpper(); + } } return language; } + public static string AdjustImageLanguage(string imageLanguage, string requestLanguage) + { + if (!string.IsNullOrEmpty(imageLanguage) + && !string.IsNullOrEmpty(requestLanguage) + && requestLanguage.Length > 2 + && imageLanguage.Length == 2 + && requestLanguage.StartsWith(imageLanguage, StringComparison.OrdinalIgnoreCase)) + { + return requestLanguage; + } + + return imageLanguage; + } + /// /// Fetches the main result. /// diff --git a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbEpisodeImageProvider.cs b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbEpisodeImageProvider.cs index 719779674b..0feb92e897 100644 --- a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbEpisodeImageProvider.cs +++ b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbEpisodeImageProvider.cs @@ -57,8 +57,10 @@ namespace MediaBrowser.Providers.TV return list; } + var language = item.GetPreferredMetadataLanguage(); + var response = await GetEpisodeInfo(seriesId, seasonNumber.Value, episodeNumber.Value, - item.GetPreferredMetadataLanguage(), cancellationToken).ConfigureAwait(false); + language, cancellationToken).ConfigureAwait(false); var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false); @@ -71,12 +73,12 @@ namespace MediaBrowser.Providers.TV VoteCount = i.vote_count, Width = i.width, Height = i.height, + Language = MovieDbProvider.AdjustImageLanguage(i.iso_639_1, language), ProviderName = Name, Type = ImageType.Primary, RatingType = RatingType.Score })); - var language = item.GetPreferredMetadataLanguage(); var isLanguageEn = string.Equals(language, "en", StringComparison.OrdinalIgnoreCase); diff --git a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbProviderBase.cs b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbProviderBase.cs index a6df245b01..821c26e4be 100644 --- a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbProviderBase.cs +++ b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbProviderBase.cs @@ -151,7 +151,7 @@ namespace MediaBrowser.Providers.TV public string file_path { get; set; } public int height { get; set; } public string id { get; set; } - public object iso_639_1 { get; set; } + public string iso_639_1 { get; set; } public double vote_average { get; set; } public int vote_count { get; set; } public int width { get; set; } diff --git a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeriesImageProvider.cs b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeriesImageProvider.cs index 06481f8f2f..ad46db6773 100644 --- a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeriesImageProvider.cs +++ b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeriesImageProvider.cs @@ -66,6 +66,8 @@ namespace MediaBrowser.Providers.TV var tmdbImageUrl = tmdbSettings.images.secure_base_url + "original"; + var language = item.GetPreferredMetadataLanguage(); + list.AddRange(GetPosters(results).Select(i => new RemoteImageInfo { Url = tmdbImageUrl + i.file_path, @@ -73,7 +75,7 @@ namespace MediaBrowser.Providers.TV VoteCount = i.vote_count, Width = i.width, Height = i.height, - Language = i.iso_639_1, + Language = MovieDbProvider.AdjustImageLanguage(i.iso_639_1, language), ProviderName = Name, Type = ImageType.Primary, RatingType = RatingType.Score @@ -91,8 +93,6 @@ namespace MediaBrowser.Providers.TV RatingType = RatingType.Score })); - var language = item.GetPreferredMetadataLanguage(); - var isLanguageEn = string.Equals(language, "en", StringComparison.OrdinalIgnoreCase); return list.OrderByDescending(i => From cf0d9883c6eec06fa8d065e585081716520e56e4 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 25 Jun 2016 01:16:54 -0400 Subject: [PATCH 4/4] fix userdata transactions --- MediaBrowser.Api/Movies/TrailersService.cs | 2 +- MediaBrowser.Model/Dlna/StreamBuilder.cs | 10 +++---- MediaBrowser.Model/Entities/MediaStream.cs | 30 +++++++++++++++++++ .../Library/MediaSourceManager.cs | 8 ----- .../Persistence/BaseSqliteRepository.cs | 2 +- .../Persistence/SqliteItemRepository.cs | 2 +- .../Persistence/SqliteUserDataRepository.cs | 20 ++++++------- 7 files changed, 47 insertions(+), 27 deletions(-) diff --git a/MediaBrowser.Api/Movies/TrailersService.cs b/MediaBrowser.Api/Movies/TrailersService.cs index d74dd5b6ac..c70620cf9f 100644 --- a/MediaBrowser.Api/Movies/TrailersService.cs +++ b/MediaBrowser.Api/Movies/TrailersService.cs @@ -58,7 +58,7 @@ namespace MediaBrowser.Api.Movies getItems.IncludeItemTypes = "Trailer"; - return new ItemsService(_userManager, _libraryManager, _userDataRepository, _localizationManager, _dtoService, _collectionManager) + return new ItemsService(_userManager, _libraryManager, _localizationManager, _dtoService) { AuthorizationContext = AuthorizationContext, Logger = Logger, diff --git a/MediaBrowser.Model/Dlna/StreamBuilder.cs b/MediaBrowser.Model/Dlna/StreamBuilder.cs index 7721bfd150..795057d673 100644 --- a/MediaBrowser.Model/Dlna/StreamBuilder.cs +++ b/MediaBrowser.Model/Dlna/StreamBuilder.cs @@ -842,17 +842,17 @@ namespace MediaBrowser.Model.Dlna { bool requiresConversion = !StringHelper.EqualsIgnoreCase(subtitleStream.Codec, profile.Format); - if (requiresConversion && !allowConversion) + if (!requiresConversion) { - continue; + return profile; } - if (!requiresConversion) + if (!allowConversion) { - return profile; + continue; } - if (subtitleStream.IsTextSubtitleStream && subtitleStream.SupportsExternalStream) + if (subtitleStream.IsTextSubtitleStream && subtitleStream.SupportsExternalStream && subtitleStream.SupportsSubtitleConversionTo(profile.Format)) { return profile; } diff --git a/MediaBrowser.Model/Entities/MediaStream.cs b/MediaBrowser.Model/Entities/MediaStream.cs index af7a034fe0..990de332e1 100644 --- a/MediaBrowser.Model/Entities/MediaStream.cs +++ b/MediaBrowser.Model/Entities/MediaStream.cs @@ -282,6 +282,36 @@ namespace MediaBrowser.Model.Entities !StringHelper.EqualsIgnoreCase(codec, "sub"); } + public bool SupportsSubtitleConversionTo(string codec) + { + if (!IsTextSubtitleStream) + { + return false; + } + + // Can't convert from this + if (StringHelper.EqualsIgnoreCase(Codec, "ass")) + { + return false; + } + if (StringHelper.EqualsIgnoreCase(Codec, "ssa")) + { + return false; + } + + // Can't convert to this + if (StringHelper.EqualsIgnoreCase(codec, "ass")) + { + return false; + } + if (StringHelper.EqualsIgnoreCase(codec, "ssa")) + { + return false; + } + + return true; + } + /// /// Gets or sets a value indicating whether [supports external stream]. /// diff --git a/MediaBrowser.Server.Implementations/Library/MediaSourceManager.cs b/MediaBrowser.Server.Implementations/Library/MediaSourceManager.cs index 1bcb02ac39..4f3fe1bf3e 100644 --- a/MediaBrowser.Server.Implementations/Library/MediaSourceManager.cs +++ b/MediaBrowser.Server.Implementations/Library/MediaSourceManager.cs @@ -69,14 +69,6 @@ namespace MediaBrowser.Server.Implementations.Library if (stream.IsTextSubtitleStream) { - if (string.Equals(stream.Codec, "ass", StringComparison.OrdinalIgnoreCase)) - { - return false; - } - if (string.Equals(stream.Codec, "ssa", StringComparison.OrdinalIgnoreCase)) - { - return false; - } return true; } diff --git a/MediaBrowser.Server.Implementations/Persistence/BaseSqliteRepository.cs b/MediaBrowser.Server.Implementations/Persistence/BaseSqliteRepository.cs index eec5b4b76c..233ab56fed 100644 --- a/MediaBrowser.Server.Implementations/Persistence/BaseSqliteRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/BaseSqliteRepository.cs @@ -8,7 +8,7 @@ namespace MediaBrowser.Server.Implementations.Persistence { public abstract class BaseSqliteRepository : IDisposable { - protected readonly SemaphoreSlim WriteLock = new SemaphoreSlim(1, 1); + protected SemaphoreSlim WriteLock = new SemaphoreSlim(1, 1); protected readonly IDbConnector DbConnector; protected ILogger Logger; diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs index 6d067e345f..d86e52b01c 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs @@ -328,7 +328,7 @@ namespace MediaBrowser.Server.Implementations.Persistence new MediaStreamColumns(_connection, Logger).AddColumns(); DataExtensions.Attach(_connection, Path.Combine(_config.ApplicationPaths.DataPath, "userdata_v2.db"), "UserDataDb"); - await userDataRepo.Initialize(_connection).ConfigureAwait(false); + await userDataRepo.Initialize(_connection, WriteLock).ConfigureAwait(false); //await Vacuum(_connection).ConfigureAwait(false); } diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteUserDataRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteUserDataRepository.cs index 812e0aa48d..62d9e76347 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteUserDataRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteUserDataRepository.cs @@ -56,8 +56,10 @@ namespace MediaBrowser.Server.Implementations.Persistence /// Opens the connection to the database /// /// Task. - public async Task Initialize(IDbConnection connection) + public async Task Initialize(IDbConnection connection, SemaphoreSlim writeLock) { + WriteLock.Dispose(); + WriteLock = writeLock; _connection = connection; string[] queries = { @@ -438,18 +440,14 @@ namespace MediaBrowser.Server.Implementations.Persistence return userData; } - protected override void CloseConnection() + protected override void Dispose(bool dispose) { - if (_connection != null) - { - if (_connection.IsOpen()) - { - _connection.Close(); - } + // handled by library database + } - _connection.Dispose(); - _connection = null; - } + protected override void CloseConnection() + { + // handled by library database } } } \ No newline at end of file