diff options
Diffstat (limited to 'MediaBrowser.Controller/Entities')
| -rw-r--r-- | MediaBrowser.Controller/Entities/Audio/Audio.cs | 63 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/BaseItem.cs | 13 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/IHasMediaSources.cs | 15 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/Video.cs | 184 |
4 files changed, 272 insertions, 3 deletions
diff --git a/MediaBrowser.Controller/Entities/Audio/Audio.cs b/MediaBrowser.Controller/Entities/Audio/Audio.cs index dca645a75..43de1f5b0 100644 --- a/MediaBrowser.Controller/Entities/Audio/Audio.cs +++ b/MediaBrowser.Controller/Entities/Audio/Audio.cs @@ -1,16 +1,27 @@ -using MediaBrowser.Controller.Providers; +using MediaBrowser.Controller.Persistence; +using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; +using MediaBrowser.Model.Dto; +using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; +using System.Threading; namespace MediaBrowser.Controller.Entities.Audio { /// <summary> /// Class Audio /// </summary> - public class Audio : BaseItem, IHasMediaStreams, IHasAlbumArtist, IHasArtist, IHasMusicGenres, IHasLookupInfo<SongInfo>, IHasTags + public class Audio : BaseItem, + IHasMediaStreams, + IHasAlbumArtist, + IHasArtist, + IHasMusicGenres, + IHasLookupInfo<SongInfo>, + IHasTags, + IHasMediaSources { public string FormatName { get; set; } public long? Size { get; set; } @@ -164,5 +175,53 @@ namespace MediaBrowser.Controller.Entities.Audio return info; } + + public virtual IEnumerable<MediaSourceInfo> GetMediaSources(bool enablePathSubstitution) + { + var result = new List<MediaSourceInfo> + { + GetVersionInfo(this, enablePathSubstitution) + }; + + return result; + } + + private static MediaSourceInfo GetVersionInfo(Audio i, bool enablePathSubstituion) + { + var locationType = i.LocationType; + + var info = new MediaSourceInfo + { + Id = i.Id.ToString("N"), + LocationType = locationType, + MediaStreams = ItemRepository.GetMediaStreams(new MediaStreamQuery { ItemId = i.Id }).ToList(), + Name = i.Name, + Path = enablePathSubstituion ? GetMappedPath(i.Path, locationType) : i.Path, + RunTimeTicks = i.RunTimeTicks, + Container = i.Container, + Size = i.Size, + Formats = (i.FormatName ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList() + }; + + if (string.IsNullOrEmpty(info.Container)) + { + if (!string.IsNullOrWhiteSpace(i.Path) && locationType != LocationType.Remote && locationType != LocationType.Virtual) + { + info.Container = System.IO.Path.GetExtension(i.Path).TrimStart('.'); + } + } + + var bitrate = i.TotalBitrate ?? + info.MediaStreams.Where(m => m.Type == MediaStreamType.Audio) + .Select(m => m.BitRate ?? 0) + .Sum(); + + if (bitrate > 0) + { + info.Bitrate = bitrate; + } + + return info; + } } } diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 52c6e951e..b7edbfc60 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -1549,5 +1549,18 @@ namespace MediaBrowser.Controller.Entities return hasChanges; } + + protected static string GetMappedPath(string path, LocationType locationType) + { + if (locationType == LocationType.FileSystem || locationType == LocationType.Offline) + { + foreach (var map in ConfigurationManager.Configuration.PathSubstitutions) + { + path = FileSystem.SubstitutePath(path, map.From, map.To); + } + } + + return path; + } } } diff --git a/MediaBrowser.Controller/Entities/IHasMediaSources.cs b/MediaBrowser.Controller/Entities/IHasMediaSources.cs new file mode 100644 index 000000000..0b0dd1bf8 --- /dev/null +++ b/MediaBrowser.Controller/Entities/IHasMediaSources.cs @@ -0,0 +1,15 @@ +using MediaBrowser.Model.Dto; +using System.Collections.Generic; + +namespace MediaBrowser.Controller.Entities +{ + public interface IHasMediaSources + { + /// <summary> + /// Gets the media sources. + /// </summary> + /// <param name="enablePathSubstitution">if set to <c>true</c> [enable path substitution].</param> + /// <returns>Task{IEnumerable{MediaSourceInfo}}.</returns> + IEnumerable<MediaSourceInfo> GetMediaSources(bool enablePathSubstitution); + } +} diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs index 9570faa73..3bc08506e 100644 --- a/MediaBrowser.Controller/Entities/Video.cs +++ b/MediaBrowser.Controller/Entities/Video.cs @@ -2,6 +2,7 @@ using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Resolvers; +using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; using MediaBrowser.Model.MediaInfo; using System; @@ -18,7 +19,12 @@ namespace MediaBrowser.Controller.Entities /// <summary> /// Class Video /// </summary> - public class Video : BaseItem, IHasMediaStreams, IHasAspectRatio, IHasTags, ISupportsPlaceHolders + public class Video : BaseItem, + IHasMediaStreams, + IHasAspectRatio, + IHasTags, + ISupportsPlaceHolders, + IHasMediaSources { public bool IsMultiPart { get; set; } public bool HasLocalAlternateVersions { get; set; } @@ -504,5 +510,181 @@ namespace MediaBrowser.Controller.Entities }).FirstOrDefault(); } + + public virtual IEnumerable<MediaSourceInfo> GetMediaSources(bool enablePathSubstitution) + { + var item = this; + + var result = item.GetAlternateVersions() + .Select(i => GetVersionInfo(enablePathSubstitution, i, MediaSourceType.Grouping)) + .ToList(); + + result.Add(GetVersionInfo(enablePathSubstitution, item, MediaSourceType.Default)); + + return result.OrderBy(i => + { + if (item.VideoType == VideoType.VideoFile) + { + return 0; + } + + return 1; + + }).ThenBy(i => i.Video3DFormat.HasValue ? 1 : 0) + .ThenByDescending(i => + { + var stream = i.VideoStream; + + return stream == null || stream.Width == null ? 0 : stream.Width.Value; + }) + .ToList(); + } + + private static MediaSourceInfo GetVersionInfo(bool enablePathSubstitution, Video i, MediaSourceType type) + { + var mediaStreams = ItemRepository.GetMediaStreams(new MediaStreamQuery { ItemId = i.Id }).ToList(); + + var locationType = i.LocationType; + + var info = new MediaSourceInfo + { + Id = i.Id.ToString("N"), + IsoType = i.IsoType, + LocationType = locationType, + MediaStreams = mediaStreams, + Name = GetMediaSourceName(i, mediaStreams), + Path = enablePathSubstitution ? GetMappedPath(i.Path, locationType) : i.Path, + RunTimeTicks = i.RunTimeTicks, + Video3DFormat = i.Video3DFormat, + VideoType = i.VideoType, + Container = i.Container, + Size = i.Size, + Formats = (i.FormatName ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList(), + Timestamp = i.Timestamp, + Type = type + }; + + if (string.IsNullOrEmpty(info.Container)) + { + if (i.VideoType == VideoType.VideoFile || i.VideoType == VideoType.Iso) + { + if (!string.IsNullOrWhiteSpace(i.Path) && locationType != LocationType.Remote && locationType != LocationType.Virtual) + { + info.Container = System.IO.Path.GetExtension(i.Path).TrimStart('.'); + } + } + } + + try + { + var bitrate = i.TotalBitrate ?? + info.MediaStreams.Where(m => m.Type != MediaStreamType.Subtitle && !string.Equals(m.Codec, "mjpeg", StringComparison.OrdinalIgnoreCase)) + .Select(m => m.BitRate ?? 0) + .Sum(); + + if (bitrate > 0) + { + info.Bitrate = bitrate; + } + } + catch (OverflowException ex) + { + Logger.ErrorException("Error calculating total bitrate", ex); + } + + return info; + } + + + private static string GetMediaSourceName(Video video, List<MediaStream> mediaStreams) + { + var terms = new List<string>(); + + var videoStream = mediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Video); + var audioStream = mediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Audio); + + if (video.Video3DFormat.HasValue) + { + terms.Add("3D"); + } + + if (video.VideoType == VideoType.BluRay) + { + terms.Add("Bluray"); + } + else if (video.VideoType == VideoType.Dvd) + { + terms.Add("DVD"); + } + else if (video.VideoType == VideoType.HdDvd) + { + terms.Add("HD-DVD"); + } + else if (video.VideoType == VideoType.Iso) + { + if (video.IsoType.HasValue) + { + if (video.IsoType.Value == Model.Entities.IsoType.BluRay) + { + terms.Add("Bluray"); + } + else if (video.IsoType.Value == Model.Entities.IsoType.Dvd) + { + terms.Add("DVD"); + } + } + else + { + terms.Add("ISO"); + } + } + + if (videoStream != null) + { + if (videoStream.Width.HasValue) + { + if (videoStream.Width.Value >= 3800) + { + terms.Add("4K"); + } + else if (videoStream.Width.Value >= 1900) + { + terms.Add("1080P"); + } + else if (videoStream.Width.Value >= 1270) + { + terms.Add("720P"); + } + else if (videoStream.Width.Value >= 700) + { + terms.Add("480P"); + } + else + { + terms.Add("SD"); + } + } + } + + if (videoStream != null && !string.IsNullOrWhiteSpace(videoStream.Codec)) + { + terms.Add(videoStream.Codec.ToUpper()); + } + + if (audioStream != null) + { + var audioCodec = string.Equals(audioStream.Codec, "dca", StringComparison.OrdinalIgnoreCase) + ? audioStream.Profile + : audioStream.Codec; + + if (!string.IsNullOrEmpty(audioCodec)) + { + terms.Add(audioCodec.ToUpper()); + } + } + + return string.Join("/", terms.ToArray()); + } + } } |
