Ver Fonte

#2407: Prefer MP4-Metadata for episodes

Ulrich Wagner há 5 anos atrás
pai
commit
d7f199bb1c

+ 25 - 0
Emby.Server.Implementations/Library/LibraryManager.cs

@@ -29,11 +29,13 @@ using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.LiveTv;
+using MediaBrowser.Controller.MediaEncoding;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Controller.Resolvers;
 using MediaBrowser.Controller.Sorting;
 using MediaBrowser.Model.Configuration;
+using MediaBrowser.Model.Dlna;
 using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.IO;
@@ -2387,6 +2389,7 @@ namespace Emby.Server.Implementations.Library
 
         public bool FillMissingEpisodeNumbersFromPath(Episode episode, bool forceRefresh)
         {
+            var libraryOptions = GetLibraryOptions(episode);
             var series = episode.Series;
             bool? isAbsoluteNaming = series == null ? false : string.Equals(series.DisplayOrder, "absolute", StringComparison.OrdinalIgnoreCase);
             if (!isAbsoluteNaming.Value)
@@ -2408,6 +2411,28 @@ namespace Emby.Server.Implementations.Library
                 episodeInfo = new Naming.TV.EpisodeInfo();
             }
 
+            if (libraryOptions.EnableEmbeddedEpisodeInfos && episodeInfo.Container.ToLowerInvariant() == "mp4") {
+                // Read from metadata
+                IMediaEncoder mediaEncoder = _appHost.Resolve<IMediaEncoder>();
+                var task = mediaEncoder.GetMediaInfo(new MediaInfoRequest
+                {
+                    MediaSource = episode.GetMediaSources(false).First(),
+                    MediaType = DlnaProfileType.Video,
+                    ExtractChapters = false
+
+                }, CancellationToken.None);
+                task.Wait();
+                if (task.Result.ParentIndexNumber > 0) {
+                    episodeInfo.SeasonNumber = task.Result.ParentIndexNumber;
+                }
+                if (task.Result.IndexNumber > 0) {
+                    episodeInfo.EpisodeNumber = task.Result.IndexNumber;
+                }
+                if (!string.IsNullOrEmpty(task.Result.ShowName)) {
+                    episodeInfo.SeriesName = task.Result.ShowName;
+                }
+            }
+
             var changed = false;
 
             if (episodeInfo.IsByDate)

+ 3 - 0
MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs

@@ -112,6 +112,9 @@ namespace MediaBrowser.MediaEncoding.Probing
                 info.Name = title;
             }
 
+            info.IndexNumber = FFProbeHelpers.GetDictionaryNumericValue(tags, "episode_sort");
+            info.ParentIndexNumber = FFProbeHelpers.GetDictionaryNumericValue(tags, "season_number");
+            info.ShowName = FFProbeHelpers.GetDictionaryValue(tags, "show_name");
             info.ProductionYear = FFProbeHelpers.GetDictionaryNumericValue(tags, "date");
 
             // Several different forms of retaildate

+ 1 - 0
MediaBrowser.Model/Configuration/LibraryOptions.cs

@@ -21,6 +21,7 @@ namespace MediaBrowser.Model.Configuration
         public bool ImportMissingEpisodes { get; set; }
         public bool EnableAutomaticSeriesGrouping { get; set; }
         public bool EnableEmbeddedTitles { get; set; }
+        public bool EnableEmbeddedEpisodeInfos { get; set; }
 
         public int AutomaticRefreshIntervalDays { get; set; }
 

+ 1 - 0
MediaBrowser.Model/MediaInfo/MediaInfo.cs

@@ -36,6 +36,7 @@ namespace MediaBrowser.Model.MediaInfo
         /// <value>The studios.</value>
         public string[] Studios { get; set; }
         public string[] Genres { get; set; }
+        public string ShowName { get; set; }
         public int? IndexNumber { get; set; }
         public int? ParentIndexNumber { get; set; }
         public int? ProductionYear { get; set; }