aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Providers
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Providers')
-rw-r--r--MediaBrowser.Providers/Manager/ImageSaver.cs14
-rw-r--r--MediaBrowser.Providers/Manager/MetadataService.cs8
-rw-r--r--MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs6
-rw-r--r--MediaBrowser.Providers/MediaInfo/SubtitleResolver.cs115
-rw-r--r--MediaBrowser.Providers/Omdb/OmdbImageProvider.cs2
-rw-r--r--MediaBrowser.Providers/Subtitles/SubtitleManager.cs97
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 ||