aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs')
-rw-r--r--MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs94
1 files changed, 88 insertions, 6 deletions
diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs b/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs
index 4fc92ddeb..ebb2f13d1 100644
--- a/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs
+++ b/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs
@@ -1,13 +1,16 @@
-using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Extensions;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.MediaInfo;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Serialization;
using System;
using System.Collections.Generic;
using System.Globalization;
+using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
@@ -18,13 +21,17 @@ namespace MediaBrowser.Providers.MediaInfo
{
private readonly IMediaEncoder _mediaEncoder;
private readonly IItemRepository _itemRepo;
+ private readonly IApplicationPaths _appPaths;
+ private readonly IJsonSerializer _json;
private readonly CultureInfo _usCulture = new CultureInfo("en-US");
-
- public FFProbeAudioInfo(IMediaEncoder mediaEncoder, IItemRepository itemRepo)
+
+ public FFProbeAudioInfo(IMediaEncoder mediaEncoder, IItemRepository itemRepo, IApplicationPaths appPaths, IJsonSerializer json)
{
_mediaEncoder = mediaEncoder;
_itemRepo = itemRepo;
+ _appPaths = appPaths;
+ _json = json;
}
public async Task<ItemUpdateType> Probe<T>(T item, CancellationToken cancellationToken)
@@ -47,10 +54,30 @@ namespace MediaBrowser.Providers.MediaInfo
{
cancellationToken.ThrowIfCancellationRequested();
+ var idString = item.Id.ToString("N");
+ var cachePath = Path.Combine(_appPaths.CachePath, "ffprobe-audio", idString.Substring(0, 2), idString, "v" + _mediaEncoder.Version + item.DateModified.Ticks.ToString(_usCulture) + ".json");
+
+ try
+ {
+ return _json.DeserializeFromFile<InternalMediaInfoResult>(cachePath);
+ }
+ catch (FileNotFoundException)
+ {
+
+ }
+ catch (DirectoryNotFoundException)
+ {
+ }
+
const InputType type = InputType.File;
var inputPath = new[] { item.Path };
- return await _mediaEncoder.GetMediaInfo(inputPath, type, false, cancellationToken).ConfigureAwait(false);
+ var result = await _mediaEncoder.GetMediaInfo(inputPath, type, false, cancellationToken).ConfigureAwait(false);
+
+ Directory.CreateDirectory(Path.GetDirectoryName(cachePath));
+ _json.SerializeToFile(result, cachePath);
+
+ return result;
}
/// <summary>
@@ -178,9 +205,14 @@ namespace MediaBrowser.Providers.MediaInfo
FetchStudios(audio, tags, "ensemble");
FetchStudios(audio, tags, "publisher");
}
+
+ audio.SetProviderId(MetadataProviders.MusicBrainzAlbumArtist, FFProbeHelpers.GetDictionaryValue(tags, "MusicBrainz Album Artist Id"));
+ audio.SetProviderId(MetadataProviders.MusicBrainzArtist, FFProbeHelpers.GetDictionaryValue(tags, "MusicBrainz Artist Id"));
+ audio.SetProviderId(MetadataProviders.MusicBrainzAlbum, FFProbeHelpers.GetDictionaryValue(tags, "MusicBrainz Album Id"));
+ audio.SetProviderId(MetadataProviders.MusicBrainzReleaseGroup, FFProbeHelpers.GetDictionaryValue(tags, "MusicBrainz Release Group Id"));
}
- private readonly char[] _nameDelimiters = new[] { '/', '|', ';', '\\' };
+ private readonly char[] _nameDelimiters = { '/', '|', ';', '\\' };
/// <summary>
/// Splits the specified val.
@@ -205,13 +237,63 @@ namespace MediaBrowser.Providers.MediaInfo
val = val.Replace(" featuring ", ArtistReplaceValue, StringComparison.OrdinalIgnoreCase)
.Replace(" feat. ", ArtistReplaceValue, StringComparison.OrdinalIgnoreCase);
+ var artistsFound = new List<string>();
+
+ foreach (var whitelistArtist in GetSplitWhitelist())
+ {
+ var originalVal = val;
+ val = val.Replace(whitelistArtist, "|", StringComparison.OrdinalIgnoreCase);
+
+ if (!string.Equals(originalVal, val, StringComparison.OrdinalIgnoreCase))
+ {
+ // TODO: Preserve casing from original value
+ artistsFound.Add(whitelistArtist);
+ }
+ }
+
// Only use the comma as a delimeter if there are no slashes or pipes.
// We want to be careful not to split names that have commas in them
var delimeter = _nameDelimiters;
- return val.Split(delimeter, StringSplitOptions.RemoveEmptyEntries)
+ var artists = val.Split(delimeter, StringSplitOptions.RemoveEmptyEntries)
.Where(i => !string.IsNullOrWhiteSpace(i))
.Select(i => i.Trim());
+
+ artistsFound.AddRange(artists);
+ return artistsFound;
+ }
+
+
+ private List<string> _splitWhiteList = null;
+
+ private IEnumerable<string> GetSplitWhitelist()
+ {
+ if (_splitWhiteList == null)
+ {
+ var file = GetType().Namespace + ".whitelist.txt";
+
+ using (var stream = GetType().Assembly.GetManifestResourceStream(file))
+ {
+ using (var reader = new StreamReader(stream))
+ {
+ var list = new List<string>();
+
+ while (!reader.EndOfStream)
+ {
+ var val = reader.ReadLine();
+
+ if (!string.IsNullOrWhiteSpace(val))
+ {
+ list.Add(val);
+ }
+ }
+
+ _splitWhiteList = list;
+ }
+ }
+ }
+
+ return _splitWhiteList;
}
/// <summary>