improve support for embedded mp4 info

pull/702/head
Luke Pulverenti 8 years ago
parent ae859fd56f
commit b52e9091bb

@ -57,7 +57,7 @@ namespace MediaBrowser.MediaEncoding.Probing
} }
var tags = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); var tags = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
var tagStreamType = isAudio ? "audio" : "video"; var tagStreamType = isAudio ? "info" : "video";
if (data.streams != null) if (data.streams != null)
{ {
@ -81,12 +81,29 @@ namespace MediaBrowser.MediaEncoding.Probing
} }
FetchGenres(info, tags); FetchGenres(info, tags);
var overview = FFProbeHelpers.GetDictionaryValue(tags, "description"); var shortOverview = FFProbeHelpers.GetDictionaryValue(tags, "description");
var overview = FFProbeHelpers.GetDictionaryValue(tags, "synopsis");
if (string.IsNullOrWhiteSpace(overview))
{
overview = shortOverview;
shortOverview = null;
}
if (string.IsNullOrWhiteSpace(overview))
{
overview = FFProbeHelpers.GetDictionaryValue(tags, "desc");
}
if (!string.IsNullOrWhiteSpace(overview)) if (!string.IsNullOrWhiteSpace(overview))
{ {
info.Overview = overview; info.Overview = overview;
} }
if (!string.IsNullOrWhiteSpace(shortOverview))
{
info.ShortOverview = shortOverview;
}
var title = FFProbeHelpers.GetDictionaryValue(tags, "title"); var title = FFProbeHelpers.GetDictionaryValue(tags, "title");
if (!string.IsNullOrWhiteSpace(title)) if (!string.IsNullOrWhiteSpace(title))
{ {
@ -105,13 +122,15 @@ namespace MediaBrowser.MediaEncoding.Probing
{ {
SetAudioRuntimeTicks(data, info); SetAudioRuntimeTicks(data, info);
// tags are normally located under data.format, but we've seen some cases with ogg where they're part of the audio stream // tags are normally located under data.format, but we've seen some cases with ogg where they're part of the info stream
// so let's create a combined list of both // so let's create a combined list of both
SetAudioInfoFromTags(info, tags); SetAudioInfoFromTags(info, tags);
} }
else else
{ {
FetchStudios(info, tags, "copyright");
var iTunEXTC = FFProbeHelpers.GetDictionaryValue(tags, "iTunEXTC"); var iTunEXTC = FFProbeHelpers.GetDictionaryValue(tags, "iTunEXTC");
if (!string.IsNullOrWhiteSpace(iTunEXTC)) if (!string.IsNullOrWhiteSpace(iTunEXTC))
{ {
@ -124,13 +143,13 @@ namespace MediaBrowser.MediaEncoding.Probing
info.OfficialRatingDescription = parts[3]; info.OfficialRatingDescription = parts[3];
} }
} }
var itunesXml = FFProbeHelpers.GetDictionaryValue(tags, "iTunMOVI"); var itunesXml = FFProbeHelpers.GetDictionaryValue(tags, "iTunMOVI");
if (!string.IsNullOrWhiteSpace(itunesXml)) if (!string.IsNullOrWhiteSpace(itunesXml))
{ {
FetchFromItunesInfo(itunesXml, info); FetchFromItunesInfo(itunesXml, info);
} }
if (data.format != null && !string.IsNullOrEmpty(data.format.duration)) if (data.format != null && !string.IsNullOrEmpty(data.format.duration))
{ {
info.RunTimeTicks = TimeSpan.FromSeconds(double.Parse(data.format.duration, _usCulture)).Ticks; info.RunTimeTicks = TimeSpan.FromSeconds(double.Parse(data.format.duration, _usCulture)).Ticks;
@ -157,7 +176,7 @@ namespace MediaBrowser.MediaEncoding.Probing
/// <summary> /// <summary>
/// Converts ffprobe stream info to our MediaStream class /// Converts ffprobe stream info to our MediaStream class
/// </summary> /// </summary>
/// <param name="isAudio">if set to <c>true</c> [is audio].</param> /// <param name="isAudio">if set to <c>true</c> [is info].</param>
/// <param name="streamInfo">The stream info.</param> /// <param name="streamInfo">The stream info.</param>
/// <param name="formatInfo">The format info.</param> /// <param name="formatInfo">The format info.</param>
/// <returns>MediaStream.</returns> /// <returns>MediaStream.</returns>
@ -190,7 +209,7 @@ namespace MediaBrowser.MediaEncoding.Probing
stream.Comment = GetDictionaryValue(streamInfo.tags, "comment"); stream.Comment = GetDictionaryValue(streamInfo.tags, "comment");
} }
if (string.Equals(streamInfo.codec_type, "audio", StringComparison.OrdinalIgnoreCase)) if (string.Equals(streamInfo.codec_type, "info", StringComparison.OrdinalIgnoreCase))
{ {
stream.Type = MediaStreamType.Audio; stream.Type = MediaStreamType.Audio;
@ -438,8 +457,8 @@ namespace MediaBrowser.MediaEncoding.Probing
{ {
if (result.streams != null) if (result.streams != null)
{ {
// Get the first audio stream // Get the first info stream
var stream = result.streams.FirstOrDefault(s => string.Equals(s.codec_type, "audio", StringComparison.OrdinalIgnoreCase)); var stream = result.streams.FirstOrDefault(s => string.Equals(s.codec_type, "info", StringComparison.OrdinalIgnoreCase));
if (stream != null) if (stream != null)
{ {
@ -703,10 +722,10 @@ namespace MediaBrowser.MediaEncoding.Probing
/// <summary> /// <summary>
/// Gets the studios from the tags collection /// Gets the studios from the tags collection
/// </summary> /// </summary>
/// <param name="audio">The audio.</param> /// <param name="info">The info.</param>
/// <param name="tags">The tags.</param> /// <param name="tags">The tags.</param>
/// <param name="tagName">Name of the tag.</param> /// <param name="tagName">Name of the tag.</param>
private void FetchStudios(Model.MediaInfo.MediaInfo audio, Dictionary<string, string> tags, string tagName) private void FetchStudios(MediaInfo info, Dictionary<string, string> tags, string tagName)
{ {
var val = FFProbeHelpers.GetDictionaryValue(tags, tagName); var val = FFProbeHelpers.GetDictionaryValue(tags, tagName);
@ -717,19 +736,19 @@ namespace MediaBrowser.MediaEncoding.Probing
foreach (var studio in studios) foreach (var studio in studios)
{ {
// Sometimes the artist name is listed here, account for that // Sometimes the artist name is listed here, account for that
if (audio.Artists.Contains(studio, StringComparer.OrdinalIgnoreCase)) if (info.Artists.Contains(studio, StringComparer.OrdinalIgnoreCase))
{ {
continue; continue;
} }
if (audio.AlbumArtists.Contains(studio, StringComparer.OrdinalIgnoreCase)) if (info.AlbumArtists.Contains(studio, StringComparer.OrdinalIgnoreCase))
{ {
continue; continue;
} }
audio.Studios.Add(studio); info.Studios.Add(studio);
} }
audio.Studios = audio.Studios info.Studios = info.Studios
.Where(i => !string.IsNullOrWhiteSpace(i)) .Where(i => !string.IsNullOrWhiteSpace(i))
.Distinct(StringComparer.OrdinalIgnoreCase) .Distinct(StringComparer.OrdinalIgnoreCase)
.ToList(); .ToList();

@ -51,6 +51,11 @@ namespace MediaBrowser.Model.MediaInfo
/// </summary> /// </summary>
/// <value>The overview.</value> /// <value>The overview.</value>
public string Overview { get; set; } public string Overview { get; set; }
/// <summary>
/// Gets or sets the short overview.
/// </summary>
/// <value>The short overview.</value>
public string ShortOverview { get; set; }
public MediaInfo() public MediaInfo()
{ {

@ -463,6 +463,11 @@ namespace MediaBrowser.Providers.MediaInfo
video.Overview = data.Overview; video.Overview = data.Overview;
} }
} }
if (string.IsNullOrWhiteSpace(video.ShortOverview) || isFullRefresh)
{
video.ShortOverview = data.ShortOverview;
}
} }
private async Task FetchPeople(Video video, Model.MediaInfo.MediaInfo data, MetadataRefreshOptions options) private async Task FetchPeople(Video video, Model.MediaInfo.MediaInfo data, MetadataRefreshOptions options)

Loading…
Cancel
Save