diff options
Diffstat (limited to 'MediaBrowser.Providers')
| -rw-r--r-- | MediaBrowser.Providers/Manager/ImageSaver.cs | 14 | ||||
| -rw-r--r-- | MediaBrowser.Providers/Manager/MetadataService.cs | 8 | ||||
| -rw-r--r-- | MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs | 6 | ||||
| -rw-r--r-- | MediaBrowser.Providers/MediaInfo/SubtitleResolver.cs | 115 | ||||
| -rw-r--r-- | MediaBrowser.Providers/Omdb/OmdbImageProvider.cs | 2 | ||||
| -rw-r--r-- | MediaBrowser.Providers/Subtitles/SubtitleManager.cs | 97 |
6 files changed, 154 insertions, 88 deletions
diff --git a/MediaBrowser.Providers/Manager/ImageSaver.cs b/MediaBrowser.Providers/Manager/ImageSaver.cs index 7fdbdbcc7a..4bf5e9208b 100644 --- a/MediaBrowser.Providers/Manager/ImageSaver.cs +++ b/MediaBrowser.Providers/Manager/ImageSaver.cs @@ -256,7 +256,7 @@ namespace MediaBrowser.Providers.Manager if (_config.Configuration.SaveMetadataHidden) { - _fileSystem.SetHidden(path, true); + SetHidden(path, true); } } finally @@ -266,6 +266,18 @@ namespace MediaBrowser.Providers.Manager } } + private void SetHidden(string path, bool hidden) + { + try + { + _fileSystem.SetHidden(path, hidden); + } + catch (Exception ex) + { + _logger.Error("Error setting hidden attribute on {0} - {1}", path, ex.Message); + } + } + /// <summary> /// Gets the save paths. /// </summary> diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index af03e21b2d..4e72240f29 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -27,6 +27,7 @@ namespace MediaBrowser.Providers.Manager protected readonly IFileSystem FileSystem; protected readonly IUserDataManager UserDataManager; protected readonly ILibraryManager LibraryManager; + private readonly SubtitleResolver _subtitleResolver; protected MetadataService(IServerConfigurationManager serverConfigurationManager, ILogger logger, IProviderManager providerManager, IFileSystem fileSystem, IUserDataManager userDataManager, ILibraryManager libraryManager) { @@ -36,6 +37,8 @@ namespace MediaBrowser.Providers.Manager FileSystem = fileSystem; UserDataManager = userDataManager; LibraryManager = libraryManager; + + _subtitleResolver = new SubtitleResolver(BaseItem.LocalizationManager, fileSystem); } public async Task<ItemUpdateType> RefreshMetadata(IHasMetadata item, MetadataRefreshOptions refreshOptions, CancellationToken cancellationToken) @@ -76,8 +79,7 @@ namespace MediaBrowser.Providers.Manager if (video != null && !video.IsPlaceHolder) { requiresRefresh = !video.SubtitleFiles - .SequenceEqual(SubtitleResolver.GetSubtitleFiles(video, refreshOptions.DirectoryService, FileSystem, false) - .OrderBy(i => i), StringComparer.OrdinalIgnoreCase); + .SequenceEqual(_subtitleResolver.GetExternalSubtitleFiles(video, refreshOptions.DirectoryService, false), StringComparer.Ordinal); } } } @@ -124,7 +126,7 @@ namespace MediaBrowser.Providers.Manager var providers = GetProviders(item, refreshOptions, isFirstRefresh, requiresRefresh) .ToList(); - if (providers.Count > 0 || isFirstRefresh) + if (providers.Count > 0 || isFirstRefresh || requiresRefresh) { if (item.BeforeMetadataRefresh()) { diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs index a6a363ffdf..1582385571 100644 --- a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs +++ b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs @@ -229,7 +229,7 @@ namespace MediaBrowser.Providers.MediaInfo extractDuringScan = libraryOptions.ExtractChapterImagesDuringLibraryScan; } - await _encodingManager.RefreshChapterImages(video, chapters, extractDuringScan, false, cancellationToken).ConfigureAwait(false); + await _encodingManager.RefreshChapterImages(video, options.DirectoryService, chapters, extractDuringScan, false, cancellationToken).ConfigureAwait(false); _chapterManager.SaveChapters(video.Id.ToString(), chapters); } @@ -472,7 +472,7 @@ namespace MediaBrowser.Providers.MediaInfo var subtitleResolver = new SubtitleResolver(_localization, _fileSystem); var startIndex = currentStreams.Count == 0 ? 0 : (currentStreams.Select(i => i.Index).Max() + 1); - var externalSubtitleStreams = subtitleResolver.GetExternalSubtitleStreams(video, startIndex, options.DirectoryService, false).ToList(); + var externalSubtitleStreams = subtitleResolver.GetExternalSubtitleStreams(video, startIndex, options.DirectoryService, false); var enableSubtitleDownloading = options.MetadataRefreshMode == MetadataRefreshMode.Default || options.MetadataRefreshMode == MetadataRefreshMode.FullRefresh; @@ -497,7 +497,7 @@ namespace MediaBrowser.Providers.MediaInfo // Rescan if (downloadedLanguages.Count > 0) { - externalSubtitleStreams = subtitleResolver.GetExternalSubtitleStreams(video, startIndex, options.DirectoryService, true).ToList(); + externalSubtitleStreams = subtitleResolver.GetExternalSubtitleStreams(video, startIndex, options.DirectoryService, true); } } diff --git a/MediaBrowser.Providers/MediaInfo/SubtitleResolver.cs b/MediaBrowser.Providers/MediaInfo/SubtitleResolver.cs index a2c10d6a86..4e264bd223 100644 --- a/MediaBrowser.Providers/MediaInfo/SubtitleResolver.cs +++ b/MediaBrowser.Providers/MediaInfo/SubtitleResolver.cs @@ -16,29 +16,91 @@ namespace MediaBrowser.Providers.MediaInfo private readonly ILocalizationManager _localization; private readonly IFileSystem _fileSystem; + private string[] SubtitleExtensions = new[] + { + ".srt", + ".ssa", + ".ass", + ".sub", + ".smi", + ".sami", + ".vtt" + }; + public SubtitleResolver(ILocalizationManager localization, IFileSystem fileSystem) { _localization = localization; _fileSystem = fileSystem; } - public IEnumerable<MediaStream> GetExternalSubtitleStreams(Video video, + public List<MediaStream> GetExternalSubtitleStreams(Video video, int startIndex, IDirectoryService directoryService, bool clearCache) { - var files = GetSubtitleFiles(video, directoryService, _fileSystem, clearCache); - var streams = new List<MediaStream>(); - var videoFileNameWithoutExtension = _fileSystem.GetFileNameWithoutExtension(video.Path); + GetExternalSubtitleStreams(streams, video.ContainingFolderPath, video.Path, startIndex, directoryService, clearCache); + + startIndex += streams.Count; + + try + { + GetExternalSubtitleStreams(streams, video.GetInternalMetadataPath(), video.Path, startIndex, directoryService, clearCache); + } + catch (IOException) + { + + } + + return streams; + } + + public List<string> GetExternalSubtitleFiles(Video video, + IDirectoryService directoryService, + bool clearCache) + { + var streams = GetExternalSubtitleStreams(video, 0, directoryService, clearCache); + + var list = new List<string>(); + + foreach (var stream in streams) + { + list.Add(stream.Path); + } + + return list; + } + + private void GetExternalSubtitleStreams(List<MediaStream> streams, string folder, + string videoPath, + int startIndex, + IDirectoryService directoryService, + bool clearCache) + { + var videoFileNameWithoutExtension = _fileSystem.GetFileNameWithoutExtension(videoPath); videoFileNameWithoutExtension = NormalizeFilenameForSubtitleComparison(videoFileNameWithoutExtension); + var files = directoryService.GetFilePaths(folder, clearCache); + foreach (var fullName in files) { + var extension = Path.GetExtension(fullName); + + if (!SubtitleExtensions.Contains(extension, StringComparer.OrdinalIgnoreCase)) + { + continue; + } + var fileNameWithoutExtension = _fileSystem.GetFileNameWithoutExtension(fullName); fileNameWithoutExtension = NormalizeFilenameForSubtitleComparison(fileNameWithoutExtension); + if (!string.Equals(videoFileNameWithoutExtension, fileNameWithoutExtension, StringComparison.OrdinalIgnoreCase) && + !fileNameWithoutExtension.StartsWith(videoFileNameWithoutExtension + ".", StringComparison.OrdinalIgnoreCase)) + { + continue; + } + var codec = Path.GetExtension(fullName).ToLower().TrimStart('.'); if (string.Equals(codec, "txt", StringComparison.OrdinalIgnoreCase)) @@ -98,8 +160,6 @@ namespace MediaBrowser.Providers.MediaInfo }); } } - - return streams; } private string NormalizeFilenameForSubtitleComparison(string filename) @@ -115,48 +175,5 @@ namespace MediaBrowser.Providers.MediaInfo return filename; } - - private static IEnumerable<string> SubtitleExtensions - { - get - { - return new[] { ".srt", ".ssa", ".ass", ".sub", ".smi", ".sami", ".vtt" }; - } - } - - public static IEnumerable<string> GetSubtitleFiles(Video video, IDirectoryService directoryService, IFileSystem fileSystem, bool clearCache) - { - var containingPath = video.ContainingFolderPath; - - if (string.IsNullOrEmpty(containingPath)) - { - throw new ArgumentException(string.Format("Cannot search for items that don't have a path: {0} {1}", video.Name, video.Id)); - } - - var files = fileSystem.GetFilePaths(containingPath, clearCache); - - var videoFileNameWithoutExtension = fileSystem.GetFileNameWithoutExtension(video.Path); - - return files.Where(i => - { - var extension = Path.GetExtension(i); - - if (SubtitleExtensions.Contains(extension, StringComparer.OrdinalIgnoreCase)) - { - var fileNameWithoutExtension = fileSystem.GetFileNameWithoutExtension(i); - - if (string.Equals(videoFileNameWithoutExtension, fileNameWithoutExtension, StringComparison.OrdinalIgnoreCase)) - { - return true; - } - if (fileNameWithoutExtension.StartsWith(videoFileNameWithoutExtension + ".", StringComparison.OrdinalIgnoreCase)) - { - return true; - } - } - - return false; - }); - } } } diff --git a/MediaBrowser.Providers/Omdb/OmdbImageProvider.cs b/MediaBrowser.Providers/Omdb/OmdbImageProvider.cs index 74bfa6e039..1ef420dddc 100644 --- a/MediaBrowser.Providers/Omdb/OmdbImageProvider.cs +++ b/MediaBrowser.Providers/Omdb/OmdbImageProvider.cs @@ -68,7 +68,7 @@ namespace MediaBrowser.Providers.Omdb list.Add(new RemoteImageInfo { ProviderName = Name, - Url = string.Format("https://img.omdbapi.com/?i={0}&apikey=82e83907", imdbId) + Url = string.Format("https://img.omdbapi.com/?i={0}&apikey=fe53f97e", imdbId) }); } } diff --git a/MediaBrowser.Providers/Subtitles/SubtitleManager.cs b/MediaBrowser.Providers/Subtitles/SubtitleManager.cs index fe655759e1..6a9b7136c0 100644 --- a/MediaBrowser.Providers/Subtitles/SubtitleManager.cs +++ b/MediaBrowser.Providers/Subtitles/SubtitleManager.cs @@ -16,8 +16,8 @@ using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; - -using MediaBrowser.Controller.IO; +using MediaBrowser.Common.Configuration; +using MediaBrowser.Controller.Configuration; using MediaBrowser.Model.IO; namespace MediaBrowser.Providers.Subtitles @@ -30,17 +30,19 @@ namespace MediaBrowser.Providers.Subtitles private readonly ILibraryMonitor _monitor; private readonly ILibraryManager _libraryManager; private readonly IMediaSourceManager _mediaSourceManager; + private readonly IServerConfigurationManager _config; public event EventHandler<SubtitleDownloadEventArgs> SubtitlesDownloaded; public event EventHandler<SubtitleDownloadFailureEventArgs> SubtitleDownloadFailure; - public SubtitleManager(ILogger logger, IFileSystem fileSystem, ILibraryMonitor monitor, ILibraryManager libraryManager, IMediaSourceManager mediaSourceManager) + public SubtitleManager(ILogger logger, IFileSystem fileSystem, ILibraryMonitor monitor, ILibraryManager libraryManager, IMediaSourceManager mediaSourceManager, IServerConfigurationManager config) { _logger = logger; _fileSystem = fileSystem; _monitor = monitor; _libraryManager = libraryManager; _mediaSourceManager = mediaSourceManager; + _config = config; } public void AddParts(IEnumerable<ISubtitleProvider> subtitleProviders) @@ -102,6 +104,11 @@ namespace MediaBrowser.Providers.Subtitles return results.SelectMany(i => i).ToArray(); } + private SubtitleOptions GetOptions() + { + return _config.GetConfiguration<SubtitleOptions>("subtitles"); + } + public async Task DownloadSubtitles(Video video, string subtitleId, CancellationToken cancellationToken) @@ -109,49 +116,37 @@ namespace MediaBrowser.Providers.Subtitles var parts = subtitleId.Split(new[] { '_' }, 2); var provider = GetProvider(parts.First()); + var saveInMediaFolder = video.IsSaveLocalMetadataEnabled(); + try { var response = await GetRemoteSubtitles(subtitleId, cancellationToken).ConfigureAwait(false); using (var stream = response.Stream) { - var savePath = Path.Combine(_fileSystem.GetDirectoryName(video.Path), - _fileSystem.GetFileNameWithoutExtension(video.Path) + "." + response.Language.ToLower()); - - if (response.IsForced) + using (var memoryStream = new MemoryStream()) { - savePath += ".forced"; - } - - savePath += "." + response.Format.ToLower(); + await stream.CopyToAsync(memoryStream).ConfigureAwait(false); + memoryStream.Position = 0; - _logger.Info("Saving subtitles to {0}", savePath); + var savePaths = new List<string>(); + var saveFileName = _fileSystem.GetFileNameWithoutExtension(video.Path) + "." + response.Language.ToLower(); - _monitor.ReportFileSystemChangeBeginning(savePath); + if (response.IsForced) + { + saveFileName += ".forced"; + } - try - { - //var isText = MediaStream.IsTextFormat(response.Format); + saveFileName += "." + response.Format.ToLower(); - using (var fs = _fileSystem.GetFileStream(savePath, FileOpenMode.Create, FileAccessMode.Write, - FileShareMode.Read, true)) + if (saveInMediaFolder) { - await stream.CopyToAsync(fs).ConfigureAwait(false); + savePaths.Add(Path.Combine(video.ContainingFolderPath, saveFileName)); } - EventHelper.FireEventIfNotNull(SubtitlesDownloaded, this, new SubtitleDownloadEventArgs - { - Item = video, - Format = response.Format, - Language = response.Language, - IsForced = response.IsForced, - Provider = provider.Name + savePaths.Add(Path.Combine(video.GetInternalMetadataPath(), saveFileName)); - }, _logger); - } - finally - { - _monitor.ReportFileSystemChangeComplete(savePath, false); + await TrySaveToFiles(memoryStream, savePaths).ConfigureAwait(false); } } } @@ -173,6 +168,46 @@ namespace MediaBrowser.Providers.Subtitles } } + private async Task TrySaveToFiles(Stream stream, List<string> savePaths) + { + Exception exceptionToThrow = null; + + foreach (var savePath in savePaths) + { + _logger.Info("Saving subtitles to {0}", savePath); + + _monitor.ReportFileSystemChangeBeginning(savePath); + + try + { + using (var fs = _fileSystem.GetFileStream(savePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true)) + { + await stream.CopyToAsync(fs).ConfigureAwait(false); + } + + return; + } + catch (Exception ex) + { + if (exceptionToThrow == null) + { + exceptionToThrow = ex; + } + } + finally + { + _monitor.ReportFileSystemChangeComplete(savePath, false); + } + + stream.Position = 0; + } + + if (exceptionToThrow != null) + { + throw exceptionToThrow; + } + } + public Task<RemoteSubtitleInfo[]> SearchSubtitles(Video video, string language, bool? isPerfectMatch, CancellationToken cancellationToken) { if (video.LocationType != LocationType.FileSystem || |
