From eec9e0482525c400e9dc7cb17bc000434adba105 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 13 Feb 2014 00:11:54 -0500 Subject: [PATCH] take photos into the core --- .../Playback/BaseStreamingService.cs | 71 ++ MediaBrowser.Api/Playback/StreamRequest.cs | 8 +- MediaBrowser.Api/UserService.cs | 2 +- .../Entities/AdultVideo.cs | 22 + .../Entities/AggregateFolder.cs | 2 +- MediaBrowser.Controller/Entities/BaseItem.cs | 52 +- .../Entities/CollectionFolder.cs | 2 +- MediaBrowser.Controller/Entities/Folder.cs | 2 +- .../Entities/IHasMetadata.cs | 6 +- .../Entities/Movies/Movie.cs | 30 +- MediaBrowser.Controller/Entities/Photo.cs | 24 + .../Entities/TV/Episode.cs | 27 +- MediaBrowser.Controller/Entities/TV/Season.cs | 12 +- MediaBrowser.Controller/Entities/TV/Series.cs | 21 + .../Entities/UserRootFolder.cs | 11 +- MediaBrowser.Controller/Entities/Video.cs | 6 +- .../Library/ILibraryManager.cs | 15 +- .../Library/ItemResolveArgs.cs | 6 +- .../MediaBrowser.Controller.csproj | 1 + .../Providers/IRemoteImageProvider.cs | 11 +- .../Resolvers/EntityResolutionHelper.cs | 28 +- .../BoxSets/MovieDbBoxSetImageProvider.cs | 9 +- .../GameGenres/GameGenreImageProvider.cs | 7 +- .../Genres/GenreImageProvider.cs | 7 +- .../Manager/MetadataService.cs | 13 +- .../Manager/ProviderManager.cs | 21 +- .../Manager/ProviderUtils.cs | 8 +- .../MediaBrowser.Providers.csproj | 5 + .../Movies/FanartMovieImageProvider.cs | 9 +- .../Movies/MovieDbImageProvider.cs | 9 +- .../Movies/MovieDbSearch.cs | 24 +- .../Music/AudioDbAlbumImageProvider.cs | 9 +- .../Music/AudioDbArtistImageProvider.cs | 9 +- .../Music/FanArtAlbumProvider.cs | 9 +- .../Music/FanArtArtistProvider.cs | 9 +- .../Music/LastFmImageProvider.cs | 9 +- .../MusicGenres/MusicGenreImageProvider.cs | 7 +- .../MusicGenres/MusicGenreMetadataService.cs | 2 - .../People/MovieDbPersonImageProvider.cs | 9 +- .../People/TvdbPersonImageProvider.cs | 9 +- MediaBrowser.Providers/Photos/ExifReader.cs | 613 ++++++++++++++++++ MediaBrowser.Providers/Photos/ExifTags.cs | 132 ++++ MediaBrowser.Providers/Photos/PhotoHelper.cs | 113 ++++ .../Photos/PhotoMetadataService.cs | 32 + .../Photos/PhotoProvider.cs | 137 ++++ .../Studios/StudiosImageProvider.cs | 7 +- .../TV/FanArtSeasonProvider.cs | 9 +- .../TV/FanartSeriesProvider.cs | 9 +- .../TV/MovieDbSeriesImageProvider.cs | 9 +- .../TV/MovieDbSeriesProvider.cs | 136 ++-- .../TV/TvdbEpisodeImageProvider.cs | 9 +- .../TV/TvdbSeasonImageProvider.cs | 9 +- .../TV/TvdbSeriesImageProvider.cs | 9 +- .../Library/LibraryManager.cs | 24 +- .../Resolvers/Audio/MusicAlbumResolver.cs | 9 +- .../Resolvers/Audio/MusicArtistResolver.cs | 4 +- .../Library/Resolvers/Movies/MovieResolver.cs | 15 +- .../Library/Resolvers/PhotoResolver.cs | 50 ++ ...MediaBrowser.Server.Implementations.csproj | 1 + .../ApplicationHost.cs | 47 +- Nuget/MediaBrowser.Common.Internal.nuspec | 4 +- Nuget/MediaBrowser.Common.nuspec | 2 +- Nuget/MediaBrowser.Server.Core.nuspec | 4 +- 63 files changed, 1567 insertions(+), 360 deletions(-) create mode 100644 MediaBrowser.Controller/Entities/Photo.cs create mode 100644 MediaBrowser.Providers/Photos/ExifReader.cs create mode 100644 MediaBrowser.Providers/Photos/ExifTags.cs create mode 100644 MediaBrowser.Providers/Photos/PhotoHelper.cs create mode 100644 MediaBrowser.Providers/Photos/PhotoMetadataService.cs create mode 100644 MediaBrowser.Providers/Photos/PhotoProvider.cs create mode 100644 MediaBrowser.Server.Implementations/Library/Resolvers/PhotoResolver.cs diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index f91a35dca4..fa49698781 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -1159,6 +1159,72 @@ namespace MediaBrowser.Api.Playback return null; } + /// + /// Parses the parameters. + /// + /// The request. + private void ParseParams(StreamRequest request) + { + var vals = request.Params.Split(';'); + + var videoRequest = request as VideoStreamRequest; + + for (var i = 0; i < vals.Length; i++) + { + var val = vals[i]; + + if (string.IsNullOrWhiteSpace(val)) + { + continue; + } + + if (i == 0) + { + request.DeviceId = val; + } + else if (i == 1) + { + if (videoRequest != null) + { + videoRequest.VideoCodec = (VideoCodecs)Enum.Parse(typeof(VideoCodecs), val, true); + } + } + else if (i == 2) + { + request.AudioCodec = (AudioCodecs)Enum.Parse(typeof(AudioCodecs), val, true); + } + else if (i == 3) + { + if (videoRequest != null) + { + videoRequest.AudioStreamIndex = int.Parse(val, UsCulture); + } + } + else if (i == 4) + { + if (videoRequest != null) + { + videoRequest.SubtitleStreamIndex = int.Parse(val, UsCulture); + } + } + else if (i == 5) + { + if (videoRequest != null) + { + videoRequest.VideoBitRate = int.Parse(val, UsCulture); + } + } + else if (i == 6) + { + request.AudioBitRate = int.Parse(val, UsCulture); + } + else if (i == 7) + { + request.AudioChannels = int.Parse(val, UsCulture); + } + } + } + /// /// Gets the state. /// @@ -1167,6 +1233,11 @@ namespace MediaBrowser.Api.Playback /// StreamState. protected async Task GetState(StreamRequest request, CancellationToken cancellationToken) { + if (!string.IsNullOrWhiteSpace(request.Params)) + { + ParseParams(request); + } + if (request.ThrowDebugError) { throw new InvalidOperationException("You asked for a debug error, you got one."); diff --git a/MediaBrowser.Api/Playback/StreamRequest.cs b/MediaBrowser.Api/Playback/StreamRequest.cs index 78682d54a2..a73a8f0d90 100644 --- a/MediaBrowser.Api/Playback/StreamRequest.cs +++ b/MediaBrowser.Api/Playback/StreamRequest.cs @@ -60,16 +60,12 @@ namespace MediaBrowser.Api.Playback [ApiMember(Name = "Static", Description = "Optional. If true, the original file will be streamed statically without any encoding. Use either no url extension or the original file extension. true/false", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")] public bool Static { get; set; } - /// - /// This is an xbox 360 param that is used with dlna. If true the item's image should be returned instead of audio or video. - /// No need to put this in api docs since it's dlna only - /// - public bool AlbumArt { get; set; } - /// /// For testing purposes /// public bool ThrowDebugError { get; set; } + + public string Params { get; set; } } public class VideoStreamRequest : StreamRequest diff --git a/MediaBrowser.Api/UserService.cs b/MediaBrowser.Api/UserService.cs index 9ddefdd053..8e94d2c83a 100644 --- a/MediaBrowser.Api/UserService.cs +++ b/MediaBrowser.Api/UserService.cs @@ -189,7 +189,7 @@ namespace MediaBrowser.Api { throw new ArgumentNullException("xmlSerializer"); } - + _xmlSerializer = xmlSerializer; _userManager = userManager; _dtoService = dtoService; diff --git a/MediaBrowser.Controller/Entities/AdultVideo.cs b/MediaBrowser.Controller/Entities/AdultVideo.cs index fc7632152c..9791f7cf79 100644 --- a/MediaBrowser.Controller/Entities/AdultVideo.cs +++ b/MediaBrowser.Controller/Entities/AdultVideo.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using MediaBrowser.Controller.Providers; namespace MediaBrowser.Controller.Entities { @@ -22,5 +23,26 @@ namespace MediaBrowser.Controller.Entities { Taglines = new List(); } + + public override bool BeforeMetadataRefresh() + { + var hasChanges = base.BeforeMetadataRefresh(); + + if (!ProductionYear.HasValue) + { + int? yearInName = null; + string name; + + NameParser.ParseName(Name, out name, out yearInName); + + if (yearInName.HasValue) + { + ProductionYear = yearInName; + hasChanges = true; + } + } + + return hasChanges; + } } } diff --git a/MediaBrowser.Controller/Entities/AggregateFolder.cs b/MediaBrowser.Controller/Entities/AggregateFolder.cs index 5cabe1cfe4..362096b5e3 100644 --- a/MediaBrowser.Controller/Entities/AggregateFolder.cs +++ b/MediaBrowser.Controller/Entities/AggregateFolder.cs @@ -66,7 +66,7 @@ namespace MediaBrowser.Controller.Entities { var path = ContainingFolderPath; - var args = new ItemResolveArgs(ConfigurationManager.ApplicationPaths, LibraryManager) + var args = new ItemResolveArgs(ConfigurationManager.ApplicationPaths, LibraryManager, directoryService) { FileInfo = new DirectoryInfo(path), Path = path, diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 8dcf086425..415b49f808 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -472,7 +472,7 @@ namespace MediaBrowser.Controller.Entities /// Loads local trailers from the file system /// /// List{Video}. - private IEnumerable LoadLocalTrailers(List fileSystemChildren) + private IEnumerable LoadLocalTrailers(List fileSystemChildren, IDirectoryService directoryService) { var files = fileSystemChildren.OfType() .Where(i => string.Equals(i.Name, TrailerFolderName, StringComparison.OrdinalIgnoreCase)) @@ -484,7 +484,7 @@ namespace MediaBrowser.Controller.Entities .Where(i => System.IO.Path.GetFileNameWithoutExtension(i.Name).EndsWith(XbmcTrailerFileSuffix, StringComparison.OrdinalIgnoreCase) && !string.Equals(Path, i.FullName, StringComparison.OrdinalIgnoreCase)) ); - return LibraryManager.ResolvePaths(files, null).Select(video => + return LibraryManager.ResolvePaths(files, directoryService, null).Select(video => { // Try to retrieve it from the db. If we don't find it, use the resolved version var dbItem = LibraryManager.GetItemById(video.Id) as Trailer; @@ -504,7 +504,7 @@ namespace MediaBrowser.Controller.Entities /// Loads the theme songs. /// /// List{Audio.Audio}. - private IEnumerable LoadThemeSongs(List fileSystemChildren) + private IEnumerable LoadThemeSongs(List fileSystemChildren, IDirectoryService directoryService) { var files = fileSystemChildren.OfType() .Where(i => string.Equals(i.Name, ThemeSongsFolderName, StringComparison.OrdinalIgnoreCase)) @@ -516,7 +516,7 @@ namespace MediaBrowser.Controller.Entities .Where(i => string.Equals(System.IO.Path.GetFileNameWithoutExtension(i.Name), ThemeSongFilename, StringComparison.OrdinalIgnoreCase)) ); - return LibraryManager.ResolvePaths(files, null).Select(audio => + return LibraryManager.ResolvePaths(files, directoryService, null).Select(audio => { // Try to retrieve it from the db. If we don't find it, use the resolved version var dbItem = LibraryManager.GetItemById(audio.Id) as Audio.Audio; @@ -536,13 +536,13 @@ namespace MediaBrowser.Controller.Entities /// Loads the video backdrops. /// /// List{Video}. - private IEnumerable