diff options
Diffstat (limited to 'MediaBrowser.Controller')
118 files changed, 1431 insertions, 811 deletions
diff --git a/MediaBrowser.Controller/Connect/ConnectSupporterSummary.cs b/MediaBrowser.Controller/Connect/ConnectSupporterSummary.cs new file mode 100644 index 000000000..20eef0521 --- /dev/null +++ b/MediaBrowser.Controller/Connect/ConnectSupporterSummary.cs @@ -0,0 +1,19 @@ +using MediaBrowser.Model.Connect; +using System.Collections.Generic; +using MediaBrowser.Model.Dto; + +namespace MediaBrowser.Controller.Connect +{ + public class ConnectSupporterSummary + { + public int MaxUsers { get; set; } + public List<ConnectUser> Users { get; set; } + public List<UserDto> EligibleUsers { get; set; } + + public ConnectSupporterSummary() + { + Users = new List<ConnectUser>(); + EligibleUsers = new List<UserDto>(); + } + } +} diff --git a/MediaBrowser.Controller/Connect/IConnectManager.cs b/MediaBrowser.Controller/Connect/IConnectManager.cs index a0ab1f9b6..7eecf6ebf 100644 --- a/MediaBrowser.Controller/Connect/IConnectManager.cs +++ b/MediaBrowser.Controller/Connect/IConnectManager.cs @@ -69,5 +69,25 @@ namespace MediaBrowser.Controller.Connect /// <param name="token">The token.</param> /// <returns><c>true</c> if [is authorization token valid] [the specified token]; otherwise, <c>false</c>.</returns> bool IsAuthorizationTokenValid(string token); + + /// <summary> + /// Gets the connect supporter summary. + /// </summary> + /// <returns>Task<ConnectSupporterSummary>.</returns> + Task<ConnectSupporterSummary> GetConnectSupporterSummary(); + + /// <summary> + /// Removes the connect supporter. + /// </summary> + /// <param name="id">The identifier.</param> + /// <returns>Task.</returns> + Task RemoveConnectSupporter(string id); + + /// <summary> + /// Adds the connect supporter. + /// </summary> + /// <param name="id">The identifier.</param> + /// <returns>Task.</returns> + Task AddConnectSupporter(string id); } } diff --git a/MediaBrowser.Controller/Devices/IDeviceManager.cs b/MediaBrowser.Controller/Devices/IDeviceManager.cs index 78eebd994..2846bcfc6 100644 --- a/MediaBrowser.Controller/Devices/IDeviceManager.cs +++ b/MediaBrowser.Controller/Devices/IDeviceManager.cs @@ -25,9 +25,10 @@ namespace MediaBrowser.Controller.Devices /// <param name="reportedId">The reported identifier.</param> /// <param name="name">The name.</param> /// <param name="appName">Name of the application.</param> + /// <param name="appVersion">The application version.</param> /// <param name="usedByUserId">The used by user identifier.</param> /// <returns>Task.</returns> - Task<DeviceInfo> RegisterDevice(string reportedId, string name, string appName, string usedByUserId); + Task<DeviceInfo> RegisterDevice(string reportedId, string name, string appName, string appVersion, string usedByUserId); /// <summary> /// Saves the capabilities. diff --git a/MediaBrowser.Controller/Diagnostics/IProcessManager.cs b/MediaBrowser.Controller/Diagnostics/IProcessManager.cs new file mode 100644 index 000000000..2e076bd88 --- /dev/null +++ b/MediaBrowser.Controller/Diagnostics/IProcessManager.cs @@ -0,0 +1,28 @@ +using System.Diagnostics; + +namespace MediaBrowser.Controller.Diagnostics +{ + /// <summary> + /// Interface IProcessManager + /// </summary> + public interface IProcessManager + { + /// <summary> + /// Gets a value indicating whether [supports suspension]. + /// </summary> + /// <value><c>true</c> if [supports suspension]; otherwise, <c>false</c>.</value> + bool SupportsSuspension { get; } + + /// <summary> + /// Suspends the process. + /// </summary> + /// <param name="process">The process.</param> + void SuspendProcess(Process process); + + /// <summary> + /// Resumes the process. + /// </summary> + /// <param name="process">The process.</param> + void ResumeProcess(Process process); + } +} diff --git a/MediaBrowser.Controller/Drawing/IImageProcessor.cs b/MediaBrowser.Controller/Drawing/IImageProcessor.cs index 8ac7d56d2..6fafc2b46 100644 --- a/MediaBrowser.Controller/Drawing/IImageProcessor.cs +++ b/MediaBrowser.Controller/Drawing/IImageProcessor.cs @@ -2,7 +2,6 @@ using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Drawing; using MediaBrowser.Model.Entities; -using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; @@ -30,10 +29,9 @@ namespace MediaBrowser.Controller.Drawing /// <summary> /// Gets the size of the image. /// </summary> - /// <param name="path">The path.</param> - /// <param name="imageDateModified">The image date modified.</param> + /// <param name="info">The information.</param> /// <returns>ImageSize.</returns> - ImageSize GetImageSize(string path, DateTime imageDateModified); + ImageSize GetImageSize(ItemImageInfo info); /// <summary> /// Adds the parts. diff --git a/MediaBrowser.Controller/Entities/Audio/Audio.cs b/MediaBrowser.Controller/Entities/Audio/Audio.cs index 902447999..100633d7f 100644 --- a/MediaBrowser.Controller/Entities/Audio/Audio.cs +++ b/MediaBrowser.Controller/Entities/Audio/Audio.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Controller.Persistence; -using MediaBrowser.Controller.Providers; +using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; @@ -22,7 +21,8 @@ namespace MediaBrowser.Controller.Entities.Audio IHasLookupInfo<SongInfo>, IHasTags, IHasMediaSources, - IThemeMedia + IThemeMedia, + IArchivable { public string FormatName { get; set; } public long? Size { get; set; } @@ -172,16 +172,6 @@ namespace MediaBrowser.Controller.Entities.Audio } /// <summary> - /// Determines whether the specified name has artist. - /// </summary> - /// <param name="name">The name.</param> - /// <returns><c>true</c> if the specified name has artist; otherwise, <c>false</c>.</returns> - public bool HasArtist(string name) - { - return AllArtists.Contains(name, StringComparer.OrdinalIgnoreCase); - } - - /// <summary> /// Gets the user data key. /// </summary> /// <returns>System.String.</returns> @@ -239,7 +229,7 @@ namespace MediaBrowser.Controller.Entities.Audio { Id = i.Id.ToString("N"), Protocol = locationType == LocationType.Remote ? MediaProtocol.Http : MediaProtocol.File, - MediaStreams = MediaSourceManager.GetMediaStreams(new MediaStreamQuery { ItemId = i.Id }).ToList(), + MediaStreams = MediaSourceManager.GetMediaStreams(i.Id).ToList(), Name = i.Name, Path = enablePathSubstituion ? GetMappedPath(i.Path, locationType) : i.Path, RunTimeTicks = i.RunTimeTicks, diff --git a/MediaBrowser.Controller/Entities/Audio/IHasAlbumArtist.cs b/MediaBrowser.Controller/Entities/Audio/IHasAlbumArtist.cs index a20f05323..56921409a 100644 --- a/MediaBrowser.Controller/Entities/Audio/IHasAlbumArtist.cs +++ b/MediaBrowser.Controller/Entities/Audio/IHasAlbumArtist.cs @@ -1,4 +1,6 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Linq; namespace MediaBrowser.Controller.Entities.Audio { @@ -9,10 +11,20 @@ namespace MediaBrowser.Controller.Entities.Audio public interface IHasArtist { - bool HasArtist(string name); - List<string> AllArtists { get; } - List<string> Artists { get; } + List<string> Artists { get; set; } + } + + public static class HasArtistExtensions + { + public static bool HasArtist(this IHasArtist hasArtist, string artist) + { + return hasArtist.Artists.Contains(artist, StringComparer.OrdinalIgnoreCase); + } + public static bool HasAnyArtist(this IHasArtist hasArtist, string artist) + { + return hasArtist.AllArtists.Contains(artist, StringComparer.OrdinalIgnoreCase); + } } } diff --git a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs index e3f523b5a..dc3f13b01 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs @@ -120,16 +120,6 @@ namespace MediaBrowser.Controller.Entities.Audio get { return Parent as MusicArtist ?? UnknwonArtist; } } - /// <summary> - /// Determines whether the specified artist has artist. - /// </summary> - /// <param name="artist">The artist.</param> - /// <returns><c>true</c> if the specified artist has artist; otherwise, <c>false</c>.</returns> - public bool HasArtist(string artist) - { - return AllArtists.Contains(artist, StringComparer.OrdinalIgnoreCase); - } - public List<string> Artists { get; set; } /// <summary> diff --git a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs index 2b8145041..4185590ab 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Providers; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Users; @@ -148,12 +149,15 @@ namespace MediaBrowser.Controller.Entities.Audio var totalItems = songs.Count + others.Count; var numComplete = 0; + var childUpdateType = ItemUpdateType.None; + // Refresh songs foreach (var item in songs) { cancellationToken.ThrowIfCancellationRequested(); - await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false); + var updateType = await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false); + childUpdateType = childUpdateType | updateType; numComplete++; double percent = numComplete; @@ -161,15 +165,22 @@ namespace MediaBrowser.Controller.Entities.Audio progress.Report(percent * 100); } + var parentRefreshOptions = refreshOptions; + if (childUpdateType > ItemUpdateType.None) + { + parentRefreshOptions = new MetadataRefreshOptions(refreshOptions); + parentRefreshOptions.MetadataRefreshMode = MetadataRefreshMode.FullRefresh; + } + // Refresh current item - await RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false); + await RefreshMetadata(parentRefreshOptions, cancellationToken).ConfigureAwait(false); // Refresh all non-songs foreach (var item in others) { cancellationToken.ThrowIfCancellationRequested(); - await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false); + var updateType = await item.RefreshMetadata(parentRefreshOptions, cancellationToken).ConfigureAwait(false); numComplete++; double percent = numComplete; @@ -202,7 +213,7 @@ namespace MediaBrowser.Controller.Entities.Audio return i => { var hasArtist = i as IHasArtist; - return hasArtist != null && hasArtist.HasArtist(Name); + return hasArtist != null && hasArtist.HasAnyArtist(Name); }; } } diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 50a6dda30..dd6189bc5 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -239,6 +239,11 @@ namespace MediaBrowser.Controller.Entities get { return this.GetImagePath(ImageType.Primary); } } + public virtual bool IsInternetMetadataEnabled() + { + return ConfigurationManager.Configuration.EnableInternetProviders; + } + public virtual bool CanDelete() { var locationType = LocationType; @@ -717,7 +722,7 @@ namespace MediaBrowser.Controller.Entities /// <param name="options">The options.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>true if a provider reports we changed</returns> - public async Task RefreshMetadata(MetadataRefreshOptions options, CancellationToken cancellationToken) + public async Task<ItemUpdateType> RefreshMetadata(MetadataRefreshOptions options, CancellationToken cancellationToken) { var locationType = LocationType; @@ -744,15 +749,16 @@ namespace MediaBrowser.Controller.Entities } } - var dateLastSaved = DateLastSaved; + var refreshOptions = requiresSave + ? new MetadataRefreshOptions(options) + { + ForceSave = true + } + : options; - await ProviderManager.RefreshMetadata(this, options, cancellationToken).ConfigureAwait(false); + var result = await ProviderManager.RefreshSingleItem(this, refreshOptions, cancellationToken).ConfigureAwait(false); - // If it wasn't saved by the provider process, save now - if (requiresSave && dateLastSaved == DateLastSaved) - { - await UpdateToRepository(ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false); - } + return result; } [IgnoreDataMember] @@ -1245,13 +1251,6 @@ namespace MediaBrowser.Controller.Entities { if (string.Equals(i.GetType().Name, info.ItemType, StringComparison.OrdinalIgnoreCase)) { - if (info.ItemYear.HasValue) - { - if (info.ItemYear.Value != (i.ProductionYear ?? -1)) - { - return false; - } - } return true; } } @@ -1461,7 +1460,8 @@ namespace MediaBrowser.Controller.Entities /// <returns>Task.</returns> public virtual Task ChangedExternally() { - return RefreshMetadata(CancellationToken.None); + ProviderManager.QueueRefresh(Id, new MetadataRefreshOptions()); + return Task.FromResult(true); } /// <summary> diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index 0d9bb03ac..cffc0989a 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -1135,10 +1135,7 @@ namespace MediaBrowser.Controller.Entities foreach (var child in LinkedChildren) { // Reset the cached value - if (child.ItemId.HasValue && child.ItemId.Value == Guid.Empty) - { - child.ItemId = null; - } + child.ItemId = null; } return false; diff --git a/MediaBrowser.Controller/Entities/IArchivable.cs b/MediaBrowser.Controller/Entities/IArchivable.cs new file mode 100644 index 000000000..575d203a7 --- /dev/null +++ b/MediaBrowser.Controller/Entities/IArchivable.cs @@ -0,0 +1,8 @@ + +namespace MediaBrowser.Controller.Entities +{ + public interface IArchivable + { + bool IsArchive { get; } + } +} diff --git a/MediaBrowser.Controller/Entities/IHasImages.cs b/MediaBrowser.Controller/Entities/IHasImages.cs index 5aafc8eb3..00a42271b 100644 --- a/MediaBrowser.Controller/Entities/IHasImages.cs +++ b/MediaBrowser.Controller/Entities/IHasImages.cs @@ -184,6 +184,12 @@ namespace MediaBrowser.Controller.Entities /// </summary> /// <value><c>true</c> if [always scan internal metadata path]; otherwise, <c>false</c>.</value> bool AlwaysScanInternalMetadataPath { get; } + + /// <summary> + /// Determines whether [is internet metadata enabled]. + /// </summary> + /// <returns><c>true</c> if [is internet metadata enabled]; otherwise, <c>false</c>.</returns> + bool IsInternetMetadataEnabled(); } public static class HasImagesExtensions diff --git a/MediaBrowser.Controller/Entities/IHasMediaSources.cs b/MediaBrowser.Controller/Entities/IHasMediaSources.cs index 98d268298..17a147806 100644 --- a/MediaBrowser.Controller/Entities/IHasMediaSources.cs +++ b/MediaBrowser.Controller/Entities/IHasMediaSources.cs @@ -1,9 +1,6 @@ -using MediaBrowser.Controller.MediaEncoding; -using MediaBrowser.Model.Dto; -using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Dto; using System; using System.Collections.Generic; -using System.Linq; namespace MediaBrowser.Controller.Entities { @@ -22,53 +19,4 @@ namespace MediaBrowser.Controller.Entities /// <returns>Task{IEnumerable{MediaSourceInfo}}.</returns> IEnumerable<MediaSourceInfo> GetMediaSources(bool enablePathSubstitution); } - - public static class HasMediaSourceExtensions - { - public static IEnumerable<MediaSourceInfo> GetMediaSources(this IHasMediaSources item, bool enablePathSubstitution, User user) - { - if (item == null) - { - throw new ArgumentNullException("item"); - } - - if (!(item is Video)) - { - return item.GetMediaSources(enablePathSubstitution); - } - - if (user == null) - { - throw new ArgumentNullException("user"); - } - - var sources = item.GetMediaSources(enablePathSubstitution).ToList(); - - var preferredAudio = string.IsNullOrEmpty(user.Configuration.AudioLanguagePreference) - ? new string[] { } - : new[] { user.Configuration.AudioLanguagePreference }; - - var preferredSubs = string.IsNullOrEmpty(user.Configuration.SubtitleLanguagePreference) - ? new List<string> { } - : new List<string> { user.Configuration.SubtitleLanguagePreference }; - - foreach (var source in sources) - { - source.DefaultAudioStreamIndex = MediaStreamSelector.GetDefaultAudioStreamIndex( - source.MediaStreams, preferredAudio, user.Configuration.PlayDefaultAudioTrack); - - var defaultAudioIndex = source.DefaultAudioStreamIndex; - var audioLangage = defaultAudioIndex == null - ? null - : source.MediaStreams.Where(i => i.Type == MediaStreamType.Audio && i.Index == defaultAudioIndex).Select(i => i.Language).FirstOrDefault(); - - source.DefaultSubtitleStreamIndex = MediaStreamSelector.GetDefaultSubtitleStreamIndex(source.MediaStreams, - preferredSubs, - user.Configuration.SubtitleMode, - audioLangage); - } - - return sources; - } - } } diff --git a/MediaBrowser.Controller/Entities/IHasOriginalTitle.cs b/MediaBrowser.Controller/Entities/IHasOriginalTitle.cs new file mode 100644 index 000000000..6f5cb59bc --- /dev/null +++ b/MediaBrowser.Controller/Entities/IHasOriginalTitle.cs @@ -0,0 +1,8 @@ + +namespace MediaBrowser.Controller.Entities +{ + public interface IHasOriginalTitle + { + string OriginalTitle { get; set; } + } +} diff --git a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs index e99c11e87..727f756f1 100644 --- a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs +++ b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs @@ -30,7 +30,6 @@ namespace MediaBrowser.Controller.Entities public string[] IncludeItemTypes { get; set; } public string[] ExcludeItemTypes { get; set; } public string[] Genres { get; set; } - public string[] AllGenres { get; set; } public bool? IsMissing { get; set; } public bool? IsUnaired { get; set; } @@ -42,6 +41,7 @@ namespace MediaBrowser.Controller.Entities public string NameLessThan { get; set; } public string Person { get; set; } + public string[] PersonIds { get; set; } public string AdjacentTo { get; set; } public string[] PersonTypes { get; set; } @@ -66,6 +66,7 @@ namespace MediaBrowser.Controller.Entities public bool? HasParentalRating { get; set; } public string[] Studios { get; set; } + public string[] StudioIds { get; set; } public ImageType[] ImageTypes { get; set; } public VideoType[] VideoTypes { get; set; } public int[] Years { get; set; } @@ -80,13 +81,14 @@ namespace MediaBrowser.Controller.Entities MediaTypes = new string[] { }; IncludeItemTypes = new string[] { }; ExcludeItemTypes = new string[] { }; - AllGenres = new string[] { }; Genres = new string[] { }; Studios = new string[] { }; + StudioIds = new string[] { }; ImageTypes = new ImageType[] { }; VideoTypes = new VideoType[] { }; Years = new int[] { }; PersonTypes = new string[] { }; + PersonIds = new string[] { }; } } } diff --git a/MediaBrowser.Controller/Entities/ItemImageInfo.cs b/MediaBrowser.Controller/Entities/ItemImageInfo.cs index 80aec6482..b36b818ff 100644 --- a/MediaBrowser.Controller/Entities/ItemImageInfo.cs +++ b/MediaBrowser.Controller/Entities/ItemImageInfo.cs @@ -5,10 +5,22 @@ namespace MediaBrowser.Controller.Entities { public class ItemImageInfo { + /// <summary> + /// Gets or sets the path. + /// </summary> + /// <value>The path.</value> public string Path { get; set; } + /// <summary> + /// Gets or sets the type. + /// </summary> + /// <value>The type.</value> public ImageType Type { get; set; } + /// <summary> + /// Gets or sets the date modified. + /// </summary> + /// <value>The date modified.</value> public DateTime DateModified { get; set; } } } diff --git a/MediaBrowser.Controller/Entities/LinkedChild.cs b/MediaBrowser.Controller/Entities/LinkedChild.cs index 78e8e4959..949c9741b 100644 --- a/MediaBrowser.Controller/Entities/LinkedChild.cs +++ b/MediaBrowser.Controller/Entities/LinkedChild.cs @@ -11,7 +11,6 @@ namespace MediaBrowser.Controller.Entities public string ItemName { get; set; } public string ItemType { get; set; } - public int? ItemYear { get; set; } [IgnoreDataMember] public string Id { get; set; } diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs index cfe008bd7..411004782 100644 --- a/MediaBrowser.Controller/Entities/Movies/Movie.cs +++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs @@ -6,7 +6,6 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; @@ -15,10 +14,11 @@ namespace MediaBrowser.Controller.Entities.Movies /// <summary> /// Class Movie /// </summary> - public class Movie : Video, IHasCriticRating, IHasSoundtracks, IHasSpecialFeatures, IHasProductionLocations, IHasBudget, IHasKeywords, IHasTrailers, IHasThemeMedia, IHasTaglines, IHasAwards, IHasMetascore, IHasLookupInfo<MovieInfo>, ISupportsBoxSetGrouping + public class Movie : Video, IHasCriticRating, IHasSoundtracks, IHasSpecialFeatures, IHasProductionLocations, IHasBudget, IHasKeywords, IHasTrailers, IHasThemeMedia, IHasTaglines, IHasAwards, IHasMetascore, IHasLookupInfo<MovieInfo>, ISupportsBoxSetGrouping, IHasOriginalTitle { public List<Guid> SpecialFeatureIds { get; set; } + public string OriginalTitle { get; set; } public List<Guid> SoundtrackIds { get; set; } public List<Guid> ThemeSongIds { get; set; } diff --git a/MediaBrowser.Controller/Entities/MusicVideo.cs b/MediaBrowser.Controller/Entities/MusicVideo.cs index 771c62fd6..b2cad02de 100644 --- a/MediaBrowser.Controller/Entities/MusicVideo.cs +++ b/MediaBrowser.Controller/Entities/MusicVideo.cs @@ -48,16 +48,6 @@ namespace MediaBrowser.Controller.Entities } /// <summary> - /// Determines whether the specified name has artist. - /// </summary> - /// <param name="name">The name.</param> - /// <returns><c>true</c> if the specified name has artist; otherwise, <c>false</c>.</returns> - public bool HasArtist(string name) - { - return AllArtists.Contains(name, StringComparer.OrdinalIgnoreCase); - } - - /// <summary> /// Gets the user data key. /// </summary> /// <returns>System.String.</returns> diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs index 4c34460d7..b4e1d9d6e 100644 --- a/MediaBrowser.Controller/Entities/TV/Series.cs +++ b/MediaBrowser.Controller/Entities/TV/Series.cs @@ -15,11 +15,12 @@ namespace MediaBrowser.Controller.Entities.TV /// <summary> /// Class Series /// </summary> - public class Series : Folder, IHasSoundtracks, IHasTrailers, IHasDisplayOrder, IHasLookupInfo<SeriesInfo>, IHasSpecialFeatures, IMetadataContainer + public class Series : Folder, IHasSoundtracks, IHasTrailers, IHasDisplayOrder, IHasLookupInfo<SeriesInfo>, IHasSpecialFeatures, IMetadataContainer, IHasOriginalTitle { public List<Guid> SpecialFeatureIds { get; set; } public List<Guid> SoundtrackIds { get; set; } + public string OriginalTitle { get; set; } public int SeasonCount { get; set; } public int? AnimeSeriesIndex { get; set; } @@ -260,7 +261,7 @@ namespace MediaBrowser.Controller.Entities.TV progress.Report(percent * 100); } - await ProviderManager.RefreshMetadata(this, refreshOptions, cancellationToken).ConfigureAwait(false); + await ProviderManager.RefreshSingleItem(this, refreshOptions, cancellationToken).ConfigureAwait(false); progress.Report(100); } diff --git a/MediaBrowser.Controller/Entities/UserView.cs b/MediaBrowser.Controller/Entities/UserView.cs index 5f7ca3d3f..9be30273a 100644 --- a/MediaBrowser.Controller/Entities/UserView.cs +++ b/MediaBrowser.Controller/Entities/UserView.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.TV; +using MediaBrowser.Controller.Playlists; +using MediaBrowser.Controller.TV; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Querying; using System; @@ -15,7 +16,13 @@ namespace MediaBrowser.Controller.Entities public Guid? UserId { get; set; } public static ITVSeriesManager TVSeriesManager; + public static IPlaylistManager PlaylistManager; + public bool ContainsDynamicCategories(User user) + { + return true; + } + public override Task<QueryResult<BaseItem>> GetItems(InternalItemsQuery query) { var parent = this as Folder; @@ -25,7 +32,7 @@ namespace MediaBrowser.Controller.Entities parent = LibraryManager.GetItemById(ParentId) as Folder ?? parent; } - return new UserViewBuilder(UserViewManager, LiveTvManager, ChannelManager, LibraryManager, Logger, UserDataManager, TVSeriesManager, CollectionManager) + return new UserViewBuilder(UserViewManager, LiveTvManager, ChannelManager, LibraryManager, Logger, UserDataManager, TVSeriesManager, CollectionManager, PlaylistManager) .GetUserItems(parent, this, ViewType, query); } @@ -45,6 +52,11 @@ namespace MediaBrowser.Controller.Entities return false; } + public override bool IsSaveLocalMetadataEnabled() + { + return true; + } + public override IEnumerable<BaseItem> GetRecursiveChildren(User user, Func<BaseItem, bool> filter) { var result = GetItems(new InternalItemsQuery diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs index 85c10c272..0e602dabe 100644 --- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs +++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs @@ -5,7 +5,7 @@ using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.LiveTv; -using MediaBrowser.Controller.Providers; +using MediaBrowser.Controller.Playlists; using MediaBrowser.Controller.TV; using MediaBrowser.Model.Channels; using MediaBrowser.Model.Entities; @@ -18,7 +18,6 @@ using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; -using MoreLinq; namespace MediaBrowser.Controller.Entities { @@ -32,8 +31,9 @@ namespace MediaBrowser.Controller.Entities private readonly IUserDataManager _userDataManager; private readonly ITVSeriesManager _tvSeriesManager; private readonly ICollectionManager _collectionManager; + private readonly IPlaylistManager _playlistManager; - public UserViewBuilder(IUserViewManager userViewManager, ILiveTvManager liveTvManager, IChannelManager channelManager, ILibraryManager libraryManager, ILogger logger, IUserDataManager userDataManager, ITVSeriesManager tvSeriesManager, ICollectionManager collectionManager) + public UserViewBuilder(IUserViewManager userViewManager, ILiveTvManager liveTvManager, IChannelManager channelManager, ILibraryManager libraryManager, ILogger logger, IUserDataManager userDataManager, ITVSeriesManager tvSeriesManager, ICollectionManager collectionManager, IPlaylistManager playlistManager) { _userViewManager = userViewManager; _liveTvManager = liveTvManager; @@ -43,6 +43,7 @@ namespace MediaBrowser.Controller.Entities _userDataManager = userDataManager; _tvSeriesManager = tvSeriesManager; _collectionManager = collectionManager; + _playlistManager = playlistManager; } public async Task<QueryResult<BaseItem>> GetUserItems(Folder queryParent, Folder displayParent, string viewType, InternalItemsQuery query) @@ -111,12 +112,21 @@ namespace MediaBrowser.Controller.Entities return GetResult(result, queryParent, query); } + case CollectionType.Books: + case CollectionType.Photos: + case CollectionType.HomeVideos: + case CollectionType.MusicVideos: + return GetResult(queryParent.GetChildren(user, true), queryParent, query); + case CollectionType.Folders: return GetResult(user.RootFolder.GetChildren(user, true), queryParent, query); case CollectionType.Games: return await GetGameView(user, queryParent, query).ConfigureAwait(false); + case CollectionType.Playlists: + return await GetPlaylistsView(queryParent, user, query).ConfigureAwait(false); + case CollectionType.BoxSets: return await GetBoxsetView(queryParent, user, query).ConfigureAwait(false); @@ -574,6 +584,11 @@ namespace MediaBrowser.Controller.Entities return GetResult(items, queryParent, query); } + private async Task<QueryResult<BaseItem>> GetPlaylistsView(Folder parent, User user, InternalItemsQuery query) + { + return GetResult(_playlistManager.GetPlaylists(user.Id.ToString("N")), parent, query); + } + private async Task<QueryResult<BaseItem>> GetBoxsetView(Folder parent, User user, InternalItemsQuery query) { return GetResult(GetMediaFolders(user).SelectMany(i => @@ -937,11 +952,6 @@ namespace MediaBrowser.Controller.Entities return false; } - if (request.AllGenres.Length > 0) - { - return false; - } - if (request.Genres.Length > 0) { return false; @@ -1047,11 +1057,21 @@ namespace MediaBrowser.Controller.Entities return false; } + if (request.PersonIds.Length > 0) + { + return false; + } + if (request.Studios.Length > 0) { return false; } + if (request.StudioIds.Length > 0) + { + return false; + } + if (request.VideoTypes.Length > 0) { return false; @@ -1571,12 +1591,6 @@ namespace MediaBrowser.Controller.Entities return false; } - // Apply genre filter - if (query.AllGenres.Length > 0 && !query.AllGenres.All(v => item.Genres.Contains(v, StringComparer.OrdinalIgnoreCase))) - { - return false; - } - // Filter by VideoType if (query.VideoTypes.Length > 0) { @@ -1598,6 +1612,16 @@ namespace MediaBrowser.Controller.Entities return false; } + // Apply studio filter + if (query.StudioIds.Length > 0 && !query.StudioIds.Any(id => + { + var studioItem = libraryManager.GetItemById(id); + return studioItem != null && item.Studios.Contains(studioItem.Name, StringComparer.OrdinalIgnoreCase); + })) + { + return false; + } + // Apply year filter if (query.Years.Length > 0) { @@ -1614,7 +1638,22 @@ namespace MediaBrowser.Controller.Entities } // Apply person filter - if (!string.IsNullOrEmpty(query.Person)) + if (query.PersonIds.Length > 0) + { + var names = query.PersonIds + .Select(libraryManager.GetItemById) + .Select(i => i == null ? "-1" : i.Name) + .ToList(); + + if (!(names.Any( + v => item.People.Select(i => i.Name).Contains(v, StringComparer.OrdinalIgnoreCase)))) + { + return false; + } + } + + // Apply person filter + if (!string.IsNullOrWhiteSpace(query.Person)) { var personTypes = query.PersonTypes; @@ -1716,7 +1755,7 @@ namespace MediaBrowser.Controller.Entities var parent = user.RootFolder; - //list.Add(await GetUserView(SpecialFolder.LiveTvNowPlaying, user, "0", parent).ConfigureAwait(false)); + //list.Add(await GetUserSubView(SpecialFolder.LiveTvNowPlaying, user, "0", parent).ConfigureAwait(false)); list.Add(await GetUserView(SpecialFolder.LiveTvChannels, user, string.Empty, parent).ConfigureAwait(false)); list.Add(await GetUserView(SpecialFolder.LiveTvRecordingGroups, user, string.Empty, parent).ConfigureAwait(false)); @@ -1725,7 +1764,7 @@ namespace MediaBrowser.Controller.Entities private async Task<UserView> GetUserView(string name, string type, User user, string sortName, BaseItem parent) { - var view = await _userViewManager.GetUserView(name, parent.Id.ToString("N"), type, user, sortName, CancellationToken.None) + var view = await _userViewManager.GetUserSubView(name, parent.Id.ToString("N"), type, user, sortName, CancellationToken.None) .ConfigureAwait(false); return view; @@ -1733,7 +1772,7 @@ namespace MediaBrowser.Controller.Entities private async Task<UserView> GetUserView(string type, User user, string sortName, BaseItem parent) { - var view = await _userViewManager.GetUserView(parent.Id.ToString("N"), type, user, sortName, CancellationToken.None) + var view = await _userViewManager.GetUserSubView(parent.Id.ToString("N"), type, user, sortName, CancellationToken.None) .ConfigureAwait(false); return view; diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs index d4507bc33..ba84beca3 100644 --- a/MediaBrowser.Controller/Entities/Video.cs +++ b/MediaBrowser.Controller/Entities/Video.cs @@ -24,7 +24,8 @@ namespace MediaBrowser.Controller.Entities IHasMediaSources, IHasShortOverview, IHasPreferredMetadataLanguage, - IThemeMedia + IThemeMedia, + IArchivable { public Guid? PrimaryVersionId { get; set; } @@ -420,12 +421,17 @@ namespace MediaBrowser.Controller.Entities return base.GetDeletePaths(); } - public virtual IEnumerable<MediaStream> GetMediaStreams() + public IEnumerable<MediaStream> GetMediaStreams() { - return MediaSourceManager.GetMediaStreams(new MediaStreamQuery + var mediaSource = GetMediaSources(false) + .FirstOrDefault(); + + if (mediaSource == null) { - ItemId = Id - }); + return new List<MediaStream>(); + } + + return mediaSource.MediaStreams; } public virtual MediaStream GetDefaultVideoStream() @@ -455,7 +461,7 @@ namespace MediaBrowser.Controller.Entities return result.OrderBy(i => { - if (item.VideoType == VideoType.VideoFile) + if (i.VideoType == VideoType.VideoFile) { return 0; } @@ -474,7 +480,7 @@ namespace MediaBrowser.Controller.Entities private static MediaSourceInfo GetVersionInfo(bool enablePathSubstitution, Video i, MediaSourceType type) { - var mediaStreams = MediaSourceManager.GetMediaStreams(new MediaStreamQuery { ItemId = i.Id }) + var mediaStreams = MediaSourceManager.GetMediaStreams(i.Id) .ToList(); var locationType = i.LocationType; @@ -551,7 +557,6 @@ namespace MediaBrowser.Controller.Entities return info; } - private static string GetMediaSourceName(Video video, List<MediaStream> mediaStreams) { var terms = new List<string>(); diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs index 9c8ed45a5..d16589f07 100644 --- a/MediaBrowser.Controller/Library/ILibraryManager.cs +++ b/MediaBrowser.Controller/Library/ILibraryManager.cs @@ -302,7 +302,7 @@ namespace MediaBrowser.Controller.Library IEnumerable<BaseItem> ReplaceVideosWithPrimaryVersions(IEnumerable<BaseItem> items); /// <summary> - /// Gets the special folder. + /// Gets the named view. /// </summary> /// <param name="user">The user.</param> /// <param name="name">The name.</param> @@ -311,7 +311,7 @@ namespace MediaBrowser.Controller.Library /// <param name="sortName">Name of the sort.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task<UserView>.</returns> - Task<UserView> GetSpecialFolder(User user, + Task<UserView> GetNamedView(User user, string name, string parentId, string viewType, @@ -321,12 +321,14 @@ namespace MediaBrowser.Controller.Library /// <summary> /// Gets the named view. /// </summary> + /// <param name="user">The user.</param> /// <param name="name">The name.</param> /// <param name="viewType">Type of the view.</param> /// <param name="sortName">Name of the sort.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task<UserView>.</returns> - Task<UserView> GetNamedView(string name, + Task<UserView> GetNamedView(User user, + string name, string viewType, string sortName, CancellationToken cancellationToken); diff --git a/MediaBrowser.Controller/Library/IMediaSourceManager.cs b/MediaBrowser.Controller/Library/IMediaSourceManager.cs index 4378bc85d..c21fed6fc 100644 --- a/MediaBrowser.Controller/Library/IMediaSourceManager.cs +++ b/MediaBrowser.Controller/Library/IMediaSourceManager.cs @@ -1,11 +1,76 @@ -using MediaBrowser.Controller.Persistence; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Persistence; +using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; +using System; using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; namespace MediaBrowser.Controller.Library { public interface IMediaSourceManager { + /// <summary> + /// Adds the parts. + /// </summary> + /// <param name="providers">The providers.</param> + void AddParts(IEnumerable<IMediaSourceProvider> providers); + + /// <summary> + /// Gets the media streams. + /// </summary> + /// <param name="itemId">The item identifier.</param> + /// <returns>IEnumerable<MediaStream>.</returns> + IEnumerable<MediaStream> GetMediaStreams(Guid itemId); + /// <summary> + /// Gets the media streams. + /// </summary> + /// <param name="mediaSourceId">The media source identifier.</param> + /// <returns>IEnumerable<MediaStream>.</returns> + IEnumerable<MediaStream> GetMediaStreams(string mediaSourceId); + /// <summary> + /// Gets the media streams. + /// </summary> + /// <param name="query">The query.</param> + /// <returns>IEnumerable<MediaStream>.</returns> IEnumerable<MediaStream> GetMediaStreams(MediaStreamQuery query); + + /// <summary> + /// Gets the playack media sources. + /// </summary> + /// <param name="id">The identifier.</param> + /// <param name="userId">The user identifier.</param> + /// <param name="enablePathSubstitution">if set to <c>true</c> [enable path substitution].</param> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns>IEnumerable<MediaSourceInfo>.</returns> + Task<IEnumerable<MediaSourceInfo>> GetPlayackMediaSources(string id, string userId, bool enablePathSubstitution, CancellationToken cancellationToken); + + /// <summary> + /// Gets the playack media sources. + /// </summary> + /// <param name="id">The identifier.</param> + /// <param name="enablePathSubstitution">if set to <c>true</c> [enable path substitution].</param> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns>Task<IEnumerable<MediaSourceInfo>>.</returns> + Task<IEnumerable<MediaSourceInfo>> GetPlayackMediaSources(string id, bool enablePathSubstitution, CancellationToken cancellationToken); + + /// <summary> + /// Gets the static media sources. + /// </summary> + /// <param name="item">The item.</param> + /// <param name="enablePathSubstitution">if set to <c>true</c> [enable path substitution].</param> + /// <param name="user">The user.</param> + /// <returns>IEnumerable<MediaSourceInfo>.</returns> + IEnumerable<MediaSourceInfo> GetStaticMediaSources(IHasMediaSources item, bool enablePathSubstitution, User user); + + /// <summary> + /// Gets the static media source. + /// </summary> + /// <param name="item">The item.</param> + /// <param name="mediaSourceId">The media source identifier.</param> + /// <param name="enablePathSubstitution">if set to <c>true</c> [enable path substitution].</param> + /// <returns>MediaSourceInfo.</returns> + MediaSourceInfo GetStaticMediaSource(IHasMediaSources item, string mediaSourceId, bool enablePathSubstitution); } } diff --git a/MediaBrowser.Controller/Library/IMediaSourceProvider.cs b/MediaBrowser.Controller/Library/IMediaSourceProvider.cs new file mode 100644 index 000000000..461285d6c --- /dev/null +++ b/MediaBrowser.Controller/Library/IMediaSourceProvider.cs @@ -0,0 +1,19 @@ +using MediaBrowser.Controller.Entities; +using MediaBrowser.Model.Dto; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Controller.Library +{ + public interface IMediaSourceProvider + { + /// <summary> + /// Gets the media sources. + /// </summary> + /// <param name="item">The item.</param> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns>Task<IEnumerable<MediaSourceInfo>>.</returns> + Task<IEnumerable<MediaSourceInfo>> GetMediaSources(IHasMediaSources item, CancellationToken cancellationToken); + } +} diff --git a/MediaBrowser.Controller/Library/IUserManager.cs b/MediaBrowser.Controller/Library/IUserManager.cs index 8119e5afb..a167cdbed 100644 --- a/MediaBrowser.Controller/Library/IUserManager.cs +++ b/MediaBrowser.Controller/Library/IUserManager.cs @@ -34,6 +34,7 @@ namespace MediaBrowser.Controller.Library event EventHandler<GenericEventArgs<User>> UserCreated; event EventHandler<GenericEventArgs<User>> UserConfigurationUpdated; event EventHandler<GenericEventArgs<User>> UserPasswordChanged; + event EventHandler<GenericEventArgs<User>> UserLockedOut; /// <summary> /// Gets a User by Id diff --git a/MediaBrowser.Controller/Library/IUserViewManager.cs b/MediaBrowser.Controller/Library/IUserViewManager.cs index f55c17924..f0b862c2d 100644 --- a/MediaBrowser.Controller/Library/IUserViewManager.cs +++ b/MediaBrowser.Controller/Library/IUserViewManager.cs @@ -12,12 +12,10 @@ namespace MediaBrowser.Controller.Library { Task<IEnumerable<Folder>> GetUserViews(UserViewQuery query, CancellationToken cancellationToken); - Task<UserView> GetUserView(string name, string parentId, string type, User user, string sortName, + Task<UserView> GetUserSubView(string name, string parentId, string type, User user, string sortName, CancellationToken cancellationToken); - Task<UserView> GetUserView(string type, string sortName, CancellationToken cancellationToken); - - Task<UserView> GetUserView(string category, string type, User user, string sortName, CancellationToken cancellationToken); + Task<UserView> GetUserSubView(string category, string type, User user, string sortName, CancellationToken cancellationToken); List<Tuple<BaseItem, List<BaseItem>>> GetLatestItems(LatestItemsQuery request); } diff --git a/MediaBrowser.Controller/LiveTv/ILiveTvItem.cs b/MediaBrowser.Controller/LiveTv/ILiveTvItem.cs new file mode 100644 index 000000000..d3334e8ea --- /dev/null +++ b/MediaBrowser.Controller/LiveTv/ILiveTvItem.cs @@ -0,0 +1,8 @@ + +namespace MediaBrowser.Controller.LiveTv +{ + public interface ILiveTvItem + { + string ServiceName { get; set; } + } +} diff --git a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs index fcd973ec2..9b36454d2 100644 --- a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs +++ b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs @@ -15,12 +15,6 @@ namespace MediaBrowser.Controller.LiveTv public interface ILiveTvManager { /// <summary> - /// Gets the active service. - /// </summary> - /// <value>The active service.</value> - ILiveTvService ActiveService { get; } - - /// <summary> /// Gets the services. /// </summary> /// <value>The services.</value> diff --git a/MediaBrowser.Controller/LiveTv/ILiveTvRecording.cs b/MediaBrowser.Controller/LiveTv/ILiveTvRecording.cs index 784cb6ea1..93e1e576a 100644 --- a/MediaBrowser.Controller/LiveTv/ILiveTvRecording.cs +++ b/MediaBrowser.Controller/LiveTv/ILiveTvRecording.cs @@ -1,4 +1,5 @@ using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Library; using System.Threading; @@ -6,10 +7,8 @@ using System.Threading.Tasks; namespace MediaBrowser.Controller.LiveTv { - public interface ILiveTvRecording : IHasImages, IHasMediaSources, IHasUserData + public interface ILiveTvRecording : IHasImages, IHasMediaSources, IHasUserData, ILiveTvItem { - string ServiceName { get; set; } - string MediaType { get; } string Container { get; } @@ -22,7 +21,7 @@ namespace MediaBrowser.Controller.LiveTv bool IsParentalAllowed(User user); - Task RefreshMetadata(MetadataRefreshOptions options, CancellationToken cancellationToken); + Task<ItemUpdateType> RefreshMetadata(MetadataRefreshOptions options, CancellationToken cancellationToken); PlayAccess GetPlayAccess(User user); diff --git a/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs b/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs index eaea6cfa4..75e418bcc 100644 --- a/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs +++ b/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs @@ -11,7 +11,7 @@ using System.Runtime.Serialization; namespace MediaBrowser.Controller.LiveTv { - public class LiveTvChannel : BaseItem, IHasMediaSources + public class LiveTvChannel : BaseItem, IHasMediaSources, ILiveTvItem { /// <summary> /// Gets the user data key. @@ -58,6 +58,10 @@ namespace MediaBrowser.Controller.LiveTv /// <value>The type of the channel.</value> public ChannelType ChannelType { get; set; } + /// <summary> + /// Gets or sets the name of the service. + /// </summary> + /// <value>The name of the service.</value> public string ServiceName { get; set; } /// <summary> diff --git a/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs b/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs index ee85ce20b..0b07d8b6d 100644 --- a/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs +++ b/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs @@ -1,5 +1,6 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.LiveTv; using MediaBrowser.Model.Users; @@ -11,7 +12,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Controller.LiveTv { - public class LiveTvProgram : BaseItem + public class LiveTvProgram : BaseItem, ILiveTvItem, IHasLookupInfo<LiveTvProgramLookupInfo> { /// <summary> /// Gets the user data key. @@ -220,5 +221,23 @@ namespace MediaBrowser.Controller.LiveTv { return false; } + + public override bool IsInternetMetadataEnabled() + { + if (IsMovie) + { + var options = (LiveTvOptions)ConfigurationManager.GetConfiguration("livetv"); + return options.EnableMovieProviders; + } + + return false; + } + + public LiveTvProgramLookupInfo GetLookupInfo() + { + var info = GetItemLookupInfo<LiveTvProgramLookupInfo>(); + info.IsMovie = IsMovie; + return info; + } } } diff --git a/MediaBrowser.Controller/LiveTv/ProgramInfo.cs b/MediaBrowser.Controller/LiveTv/ProgramInfo.cs index 4d7e5ee63..36f082b02 100644 --- a/MediaBrowser.Controller/LiveTv/ProgramInfo.cs +++ b/MediaBrowser.Controller/LiveTv/ProgramInfo.cs @@ -145,6 +145,12 @@ namespace MediaBrowser.Controller.LiveTv /// <value><c>true</c> if this instance is premiere; otherwise, <c>false</c>.</value> public bool IsPremiere { get; set; } + /// <summary> + /// Gets or sets the production year. + /// </summary> + /// <value>The production year.</value> + public int? ProductionYear { get; set; } + public ProgramInfo() { Genres = new List<string>(); diff --git a/MediaBrowser.Controller/LiveTv/RecordingGroup.cs b/MediaBrowser.Controller/LiveTv/RecordingGroup.cs index d7250d9d2..175cf162b 100644 --- a/MediaBrowser.Controller/LiveTv/RecordingGroup.cs +++ b/MediaBrowser.Controller/LiveTv/RecordingGroup.cs @@ -1,5 +1,4 @@ using MediaBrowser.Controller.Entities; -using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Users; namespace MediaBrowser.Controller.LiveTv diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index e9531e057..e4a31c82d 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -99,11 +99,13 @@ <Compile Include="Collections\CollectionCreationOptions.cs" /> <Compile Include="Collections\CollectionEvents.cs" /> <Compile Include="Collections\ICollectionManager.cs" /> + <Compile Include="Connect\ConnectSupporterSummary.cs" /> <Compile Include="Connect\IConnectManager.cs" /> <Compile Include="Connect\UserLinkResult.cs" /> <Compile Include="Devices\CameraImageUploadInfo.cs" /> <Compile Include="Devices\IDeviceManager.cs" /> <Compile Include="Devices\IDeviceRepository.cs" /> + <Compile Include="Diagnostics\IProcessManager.cs" /> <Compile Include="Dlna\ControlRequest.cs" /> <Compile Include="Dlna\ControlResponse.cs" /> <Compile Include="Dlna\EventSubscriptionResponse.cs" /> @@ -129,6 +131,7 @@ <Compile Include="Entities\Game.cs" /> <Compile Include="Entities\GameGenre.cs" /> <Compile Include="Entities\GameSystem.cs" /> + <Compile Include="Entities\IArchivable.cs" /> <Compile Include="Entities\IByReferenceItem.cs" /> <Compile Include="Entities\IHasAspectRatio.cs" /> <Compile Include="Entities\IHasBudget.cs" /> @@ -138,6 +141,7 @@ <Compile Include="Entities\IHasKeywords.cs" /> <Compile Include="Entities\IHasMediaSources.cs" /> <Compile Include="Entities\IHasMetascore.cs" /> + <Compile Include="Entities\IHasOriginalTitle.cs" /> <Compile Include="Entities\IHasPreferredMetadataLanguage.cs" /> <Compile Include="Entities\IHasProductionLocations.cs" /> <Compile Include="Entities\IHasScreenshots.cs" /> @@ -171,6 +175,7 @@ <Compile Include="Library\DeleteOptions.cs" /> <Compile Include="Library\ILibraryPostScanTask.cs" /> <Compile Include="Library\IMediaSourceManager.cs" /> + <Compile Include="Library\IMediaSourceProvider.cs" /> <Compile Include="Library\IMetadataFileSaver.cs" /> <Compile Include="Library\IMetadataSaver.cs" /> <Compile Include="Library\IMusicManager.cs" /> @@ -182,6 +187,7 @@ <Compile Include="Library\MetadataConfigurationStore.cs" /> <Compile Include="Library\PlaybackStopEventArgs.cs" /> <Compile Include="Library\UserDataSaveEventArgs.cs" /> + <Compile Include="LiveTv\ILiveTvItem.cs" /> <Compile Include="LiveTv\RecordingGroup.cs" /> <Compile Include="LiveTv\RecordingStatusChangedEventArgs.cs" /> <Compile Include="LiveTv\ILiveTvRecording.cs" /> @@ -243,22 +249,69 @@ <Compile Include="Persistence\MediaStreamQuery.cs" /> <Compile Include="Playlists\IPlaylistManager.cs" /> <Compile Include="Playlists\Playlist.cs" /> + <Compile Include="Plugins\ILocalizablePlugin.cs" /> + <Compile Include="Providers\AlbumInfo.cs" /> + <Compile Include="Providers\ArtistInfo.cs" /> + <Compile Include="Providers\BookInfo.cs" /> + <Compile Include="Providers\BoxSetInfo.cs" /> + <Compile Include="Providers\ChannelItemLookupInfo.cs" /> <Compile Include="Providers\DirectoryService.cs" /> + <Compile Include="Providers\DynamicImageInfo.cs" /> + <Compile Include="Providers\DynamicImageResponse.cs" /> + <Compile Include="Providers\EpisodeIdentity.cs" /> + <Compile Include="Providers\EpisodeInfo.cs" /> + <Compile Include="Providers\ExtraInfo.cs" /> + <Compile Include="Providers\ExtraSource.cs" /> + <Compile Include="Providers\GameInfo.cs" /> + <Compile Include="Providers\GameSystemInfo.cs" /> <Compile Include="Providers\ICustomMetadataProvider.cs" /> + <Compile Include="Providers\IDirectoryService.cs" /> + <Compile Include="Providers\IDynamicImageProvider.cs" /> <Compile Include="Providers\IExternalId.cs" /> <Compile Include="Providers\IExtrasProvider.cs" /> <Compile Include="Providers\IForcedProvider.cs" /> <Compile Include="Providers\IHasChangeMonitor.cs" /> <Compile Include="Entities\IHasMetadata.cs" /> + <Compile Include="Providers\IHasIdentities.cs" /> + <Compile Include="Providers\IHasItemChangeMonitor.cs" /> + <Compile Include="Providers\IHasLookupInfo.cs" /> + <Compile Include="Providers\IHasOrder.cs" /> + <Compile Include="Providers\IImageFileSaver.cs" /> <Compile Include="Providers\IImageProvider.cs" /> <Compile Include="Providers\IImageSaver.cs" /> + <Compile Include="Providers\IItemIdentity.cs" /> + <Compile Include="Providers\IItemIdentityConverter.cs" /> + <Compile Include="Providers\IItemIdentityProvider.cs" /> + <Compile Include="Providers\ILocalImageFileProvider.cs" /> <Compile Include="Providers\ILocalMetadataProvider.cs" /> + <Compile Include="Providers\ImageRefreshMode.cs" /> + <Compile Include="Providers\ImageRefreshOptions.cs" /> + <Compile Include="Providers\IPreRefreshProvider.cs" /> <Compile Include="Providers\IProviderRepository.cs" /> <Compile Include="Providers\IRemoteImageProvider.cs" /> <Compile Include="Providers\ILocalImageProvider.cs" /> <Compile Include="Providers\IMetadataProvider.cs" /> <Compile Include="Providers\IMetadataService.cs" /> <Compile Include="Providers\IRemoteMetadataProvider.cs" /> + <Compile Include="Providers\IRemoteSearchProvider.cs" /> + <Compile Include="Providers\ISeriesOrderProvider.cs" /> + <Compile Include="Providers\ItemInfo.cs" /> + <Compile Include="Providers\LiveTvProgramLookupInfo.cs" /> + <Compile Include="Providers\LocalImageInfo.cs" /> + <Compile Include="Providers\LocalMetadataResult.cs" /> + <Compile Include="Providers\MetadataRefreshMode.cs" /> + <Compile Include="Providers\MetadataResult.cs" /> + <Compile Include="Providers\MovieInfo.cs" /> + <Compile Include="Providers\MusicVideoInfo.cs" /> + <Compile Include="Providers\PersonLookupInfo.cs" /> + <Compile Include="Providers\RemoteSearchQuery.cs" /> + <Compile Include="Providers\SeasonIdentity.cs" /> + <Compile Include="Providers\SeasonInfo.cs" /> + <Compile Include="Providers\SeriesIdentity.cs" /> + <Compile Include="Providers\SeriesInfo.cs" /> + <Compile Include="Providers\SeriesOrderTypes.cs" /> + <Compile Include="Providers\SongInfo.cs" /> + <Compile Include="Providers\TrailerInfo.cs" /> <Compile Include="Providers\VideoContentType.cs" /> <Compile Include="RelatedMedia\IRelatedMediaProvider.cs" /> <Compile Include="Security\AuthenticationInfo.cs" /> @@ -341,11 +394,12 @@ <Compile Include="Subtitles\SubtitleDownloadEventArgs.cs" /> <Compile Include="Subtitles\SubtitleResponse.cs" /> <Compile Include="Subtitles\SubtitleSearchRequest.cs" /> - <Compile Include="Sync\ICloudSyncProvider.cs" /> <Compile Include="Sync\IServerSyncProvider.cs" /> + <Compile Include="Sync\ISyncDataProvider.cs" /> <Compile Include="Sync\ISyncManager.cs" /> <Compile Include="Sync\ISyncProvider.cs" /> <Compile Include="Sync\ISyncRepository.cs" /> + <Compile Include="Sync\SendFileResult.cs" /> <Compile Include="Themes\IAppThemeManager.cs" /> <Compile Include="Themes\InternalThemeImage.cs" /> <Compile Include="TV\ITVSeriesManager.cs" /> diff --git a/MediaBrowser.Controller/Net/BasePeriodicWebSocketListener.cs b/MediaBrowser.Controller/Net/BasePeriodicWebSocketListener.cs index 990d23970..0afaf955e 100644 --- a/MediaBrowser.Controller/Net/BasePeriodicWebSocketListener.cs +++ b/MediaBrowser.Controller/Net/BasePeriodicWebSocketListener.cs @@ -70,6 +70,11 @@ namespace MediaBrowser.Controller.Net /// <returns>Task.</returns> public Task ProcessMessage(WebSocketMessageInfo message) { + if (message == null) + { + throw new ArgumentNullException("message"); + } + if (message.MessageType.Equals(Name + "Start", StringComparison.OrdinalIgnoreCase)) { Start(message); diff --git a/MediaBrowser.Controller/Net/IHttpServer.cs b/MediaBrowser.Controller/Net/IHttpServer.cs index 315b48b83..37142af19 100644 --- a/MediaBrowser.Controller/Net/IHttpServer.cs +++ b/MediaBrowser.Controller/Net/IHttpServer.cs @@ -45,6 +45,11 @@ namespace MediaBrowser.Controller.Net event EventHandler<WebSocketConnectEventArgs> WebSocketConnected; /// <summary> + /// Occurs when [web socket connecting]. + /// </summary> + event EventHandler<WebSocketConnectingEventArgs> WebSocketConnecting; + + /// <summary> /// Inits this instance. /// </summary> void Init(IEnumerable<IRestfulService> services); diff --git a/MediaBrowser.Controller/Net/IServerManager.cs b/MediaBrowser.Controller/Net/IServerManager.cs index d90a0f8ed..5191a62e3 100644 --- a/MediaBrowser.Controller/Net/IServerManager.cs +++ b/MediaBrowser.Controller/Net/IServerManager.cs @@ -1,4 +1,4 @@ -using MediaBrowser.Common.Net; +using MediaBrowser.Model.Events; using System; using System.Collections.Generic; using System.Threading; @@ -58,5 +58,10 @@ namespace MediaBrowser.Controller.Net /// </summary> /// <value>The web socket connections.</value> IEnumerable<IWebSocketConnection> WebSocketConnections { get; } + + /// <summary> + /// Occurs when [web socket connected]. + /// </summary> + event EventHandler<GenericEventArgs<IWebSocketConnection>> WebSocketConnected; } }
\ No newline at end of file diff --git a/MediaBrowser.Controller/Net/ISessionContext.cs b/MediaBrowser.Controller/Net/ISessionContext.cs index be8d28acc..167e17867 100644 --- a/MediaBrowser.Controller/Net/ISessionContext.cs +++ b/MediaBrowser.Controller/Net/ISessionContext.cs @@ -1,14 +1,15 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Session; +using System.Threading.Tasks; namespace MediaBrowser.Controller.Net { public interface ISessionContext { - SessionInfo GetSession(object requestContext); - User GetUser(object requestContext); - - SessionInfo GetSession(IServiceRequest requestContext); - User GetUser(IServiceRequest requestContext); + Task<SessionInfo> GetSession(object requestContext); + Task<User> GetUser(object requestContext); + + Task<SessionInfo> GetSession(IServiceRequest requestContext); + Task<User> GetUser(IServiceRequest requestContext); } } diff --git a/MediaBrowser.Controller/Net/IWebSocketConnection.cs b/MediaBrowser.Controller/Net/IWebSocketConnection.cs index 37fd6708d..e21df3c39 100644 --- a/MediaBrowser.Controller/Net/IWebSocketConnection.cs +++ b/MediaBrowser.Controller/Net/IWebSocketConnection.cs @@ -1,5 +1,6 @@ using MediaBrowser.Model.Net; using System; +using System.Collections.Specialized; using System.Threading; using System.Threading.Tasks; @@ -11,7 +12,7 @@ namespace MediaBrowser.Controller.Net /// Occurs when [closed]. /// </summary> event EventHandler<EventArgs> Closed; - + /// <summary> /// Gets the id. /// </summary> @@ -25,6 +26,17 @@ namespace MediaBrowser.Controller.Net DateTime LastActivityDate { get; } /// <summary> + /// Gets or sets the URL. + /// </summary> + /// <value>The URL.</value> + string Url { get; set; } + /// <summary> + /// Gets or sets the query string. + /// </summary> + /// <value>The query string.</value> + NameValueCollection QueryString { get; set; } + + /// <summary> /// Gets or sets the receive action. /// </summary> /// <value>The receive action.</value> diff --git a/MediaBrowser.Controller/Net/StaticResultOptions.cs b/MediaBrowser.Controller/Net/StaticResultOptions.cs index 5bb2c9a5c..6a104554a 100644 --- a/MediaBrowser.Controller/Net/StaticResultOptions.cs +++ b/MediaBrowser.Controller/Net/StaticResultOptions.cs @@ -18,11 +18,6 @@ namespace MediaBrowser.Controller.Net public IDictionary<string, string> ResponseHeaders { get; set; } - public bool Throttle { get; set; } - public long ThrottleLimit { get; set; } - public long MinThrottlePosition { get; set; } - public Func<long, long, long> ThrottleCallback { get; set; } - public Action OnComplete { get; set; } public StaticResultOptions() diff --git a/MediaBrowser.Controller/Net/WebSocketConnectEventArgs.cs b/MediaBrowser.Controller/Net/WebSocketConnectEventArgs.cs index 394fcd92f..ffeaf286e 100644 --- a/MediaBrowser.Controller/Net/WebSocketConnectEventArgs.cs +++ b/MediaBrowser.Controller/Net/WebSocketConnectEventArgs.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Specialized; namespace MediaBrowser.Controller.Net { @@ -8,6 +9,16 @@ namespace MediaBrowser.Controller.Net public class WebSocketConnectEventArgs : EventArgs { /// <summary> + /// Gets or sets the URL. + /// </summary> + /// <value>The URL.</value> + public string Url { get; set; } + /// <summary> + /// Gets or sets the query string. + /// </summary> + /// <value>The query string.</value> + public NameValueCollection QueryString { get; set; } + /// <summary> /// Gets or sets the web socket. /// </summary> /// <value>The web socket.</value> @@ -18,4 +29,35 @@ namespace MediaBrowser.Controller.Net /// <value>The endpoint.</value> public string Endpoint { get; set; } } + + public class WebSocketConnectingEventArgs : EventArgs + { + /// <summary> + /// Gets or sets the URL. + /// </summary> + /// <value>The URL.</value> + public string Url { get; set; } + /// <summary> + /// Gets or sets the endpoint. + /// </summary> + /// <value>The endpoint.</value> + public string Endpoint { get; set; } + /// <summary> + /// Gets or sets the query string. + /// </summary> + /// <value>The query string.</value> + public NameValueCollection QueryString { get; set; } + /// <summary> + /// Gets or sets a value indicating whether [allow connection]. + /// </summary> + /// <value><c>true</c> if [allow connection]; otherwise, <c>false</c>.</value> + public bool AllowConnection { get; set; } + + public WebSocketConnectingEventArgs() + { + QueryString = new NameValueCollection(); + AllowConnection = true; + } + } + } diff --git a/MediaBrowser.Controller/Playlists/Playlist.cs b/MediaBrowser.Controller/Playlists/Playlist.cs index 3479902cb..fdc36db35 100644 --- a/MediaBrowser.Controller/Playlists/Playlist.cs +++ b/MediaBrowser.Controller/Playlists/Playlist.cs @@ -106,7 +106,7 @@ namespace MediaBrowser.Controller.Playlists Func<BaseItem, bool> filter = i => { var audio = i as Audio; - return audio != null && audio.HasArtist(musicArtist.Name); + return audio != null && audio.HasAnyArtist(musicArtist.Name); }; var items = user == null diff --git a/MediaBrowser.Controller/Plugins/ILocalizablePlugin.cs b/MediaBrowser.Controller/Plugins/ILocalizablePlugin.cs new file mode 100644 index 000000000..d294107d7 --- /dev/null +++ b/MediaBrowser.Controller/Plugins/ILocalizablePlugin.cs @@ -0,0 +1,20 @@ +using System.IO; +using System.Reflection; + +namespace MediaBrowser.Controller.Plugins +{ + public interface ILocalizablePlugin + { + Stream GetDictionary(string culture); + } + + public static class LocalizablePluginHelper + { + public static Stream GetDictionary(Assembly assembly, string manifestPrefix, string culture) + { + // Find all dictionaries using GetManifestResourceNames, start start with the prefix + // Return the one for the culture if exists, otherwise return the default + return null; + } + } +} diff --git a/MediaBrowser.Controller/Providers/AlbumInfo.cs b/MediaBrowser.Controller/Providers/AlbumInfo.cs new file mode 100644 index 000000000..b88477409 --- /dev/null +++ b/MediaBrowser.Controller/Providers/AlbumInfo.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; + +namespace MediaBrowser.Controller.Providers +{ + public class AlbumInfo : ItemLookupInfo + { + /// <summary> + /// Gets or sets the album artist. + /// </summary> + /// <value>The album artist.</value> + public List<string> AlbumArtists { get; set; } + + /// <summary> + /// Gets or sets the artist provider ids. + /// </summary> + /// <value>The artist provider ids.</value> + public Dictionary<string, string> ArtistProviderIds { get; set; } + public List<SongInfo> SongInfos { get; set; } + + public AlbumInfo() + { + ArtistProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); + SongInfos = new List<SongInfo>(); + AlbumArtists = new List<string>(); + } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/ArtistInfo.cs b/MediaBrowser.Controller/Providers/ArtistInfo.cs new file mode 100644 index 000000000..8a4abd5c6 --- /dev/null +++ b/MediaBrowser.Controller/Providers/ArtistInfo.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; + +namespace MediaBrowser.Controller.Providers +{ + public class ArtistInfo : ItemLookupInfo + { + public List<SongInfo> SongInfos { get; set; } + + public ArtistInfo() + { + SongInfos = new List<SongInfo>(); + } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs index a22e492f4..6facc1074 100644 --- a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs +++ b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs @@ -126,6 +126,21 @@ namespace MediaBrowser.Controller.Providers break; } + case "OriginalTitle": + { + var val = reader.ReadElementContentAsString(); + + var hasOriginalTitle = item as IHasOriginalTitle; + if (hasOriginalTitle != null) + { + if (!string.IsNullOrEmpty(hasOriginalTitle.OriginalTitle)) + { + hasOriginalTitle.OriginalTitle = val; + } + } + break; + } + case "LocalTitle": item.Name = reader.ReadElementContentAsString(); break; @@ -1407,23 +1422,6 @@ namespace MediaBrowser.Controller.Providers break; } - case "Year": - { - var val = reader.ReadElementContentAsString(); - - if (!string.IsNullOrWhiteSpace(val)) - { - int rval; - - if (int.TryParse(val, NumberStyles.Integer, _usCulture, out rval)) - { - linkedItem.ItemYear = rval; - } - } - - break; - } - default: reader.Skip(); break; diff --git a/MediaBrowser.Controller/Providers/BookInfo.cs b/MediaBrowser.Controller/Providers/BookInfo.cs new file mode 100644 index 000000000..52519bcb0 --- /dev/null +++ b/MediaBrowser.Controller/Providers/BookInfo.cs @@ -0,0 +1,7 @@ +namespace MediaBrowser.Controller.Providers +{ + public class BookInfo : ItemLookupInfo + { + public string SeriesName { get; set; } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/BoxSetInfo.cs b/MediaBrowser.Controller/Providers/BoxSetInfo.cs new file mode 100644 index 000000000..f604231de --- /dev/null +++ b/MediaBrowser.Controller/Providers/BoxSetInfo.cs @@ -0,0 +1,7 @@ +namespace MediaBrowser.Controller.Providers +{ + public class BoxSetInfo : ItemLookupInfo + { + + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/ChannelItemLookupInfo.cs b/MediaBrowser.Controller/Providers/ChannelItemLookupInfo.cs new file mode 100644 index 000000000..6c972f3bf --- /dev/null +++ b/MediaBrowser.Controller/Providers/ChannelItemLookupInfo.cs @@ -0,0 +1,11 @@ +using MediaBrowser.Model.Channels; +using MediaBrowser.Model.Entities; + +namespace MediaBrowser.Controller.Providers +{ + public class ChannelItemLookupInfo : ItemLookupInfo + { + public ChannelMediaContentType ContentType { get; set; } + public ExtraType ExtraType { get; set; } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/DirectoryService.cs b/MediaBrowser.Controller/Providers/DirectoryService.cs index 06ea7be02..9e549dcf3 100644 --- a/MediaBrowser.Controller/Providers/DirectoryService.cs +++ b/MediaBrowser.Controller/Providers/DirectoryService.cs @@ -7,16 +7,6 @@ using System.Linq; namespace MediaBrowser.Controller.Providers { - public interface IDirectoryService - { - IEnumerable<FileSystemInfo> GetFileSystemEntries(string path); - IEnumerable<FileSystemInfo> GetFiles(string path); - IEnumerable<FileSystemInfo> GetDirectories(string path); - IEnumerable<FileSystemInfo> GetFiles(string path, bool clearCache); - FileSystemInfo GetFile(string path); - Dictionary<string, FileSystemInfo> GetFileSystemDictionary(string path); - } - public class DirectoryService : IDirectoryService { private readonly ILogger _logger; diff --git a/MediaBrowser.Controller/Providers/DynamicImageInfo.cs b/MediaBrowser.Controller/Providers/DynamicImageInfo.cs new file mode 100644 index 000000000..14b4c6afb --- /dev/null +++ b/MediaBrowser.Controller/Providers/DynamicImageInfo.cs @@ -0,0 +1,10 @@ +using MediaBrowser.Model.Entities; + +namespace MediaBrowser.Controller.Providers +{ + public class DynamicImageInfo + { + public string ImageId { get; set; } + public ImageType Type { get; set; } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/DynamicImageResponse.cs b/MediaBrowser.Controller/Providers/DynamicImageResponse.cs new file mode 100644 index 000000000..71a937cd9 --- /dev/null +++ b/MediaBrowser.Controller/Providers/DynamicImageResponse.cs @@ -0,0 +1,35 @@ +using System; +using System.IO; +using MediaBrowser.Model.Drawing; + +namespace MediaBrowser.Controller.Providers +{ + public class DynamicImageResponse + { + public string Path { get; set; } + public Stream Stream { get; set; } + public ImageFormat Format { get; set; } + public bool HasImage { get; set; } + public string InternalCacheKey { get; set; } + + public void SetFormatFromMimeType(string mimeType) + { + if (mimeType.EndsWith("gif", StringComparison.OrdinalIgnoreCase)) + { + Format = ImageFormat.Gif; + } + else if (mimeType.EndsWith("bmp", StringComparison.OrdinalIgnoreCase)) + { + Format = ImageFormat.Bmp; + } + else if (mimeType.EndsWith("png", StringComparison.OrdinalIgnoreCase)) + { + Format = ImageFormat.Png; + } + else + { + Format = ImageFormat.Jpg; + } + } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/EpisodeIdentity.cs b/MediaBrowser.Controller/Providers/EpisodeIdentity.cs new file mode 100644 index 000000000..53f469e95 --- /dev/null +++ b/MediaBrowser.Controller/Providers/EpisodeIdentity.cs @@ -0,0 +1,12 @@ +namespace MediaBrowser.Controller.Providers +{ + public class EpisodeIdentity : IItemIdentity + { + public string Type { get; set; } + + public string SeriesId { get; set; } + public int? SeasonIndex { get; set; } + public int IndexNumber { get; set; } + public int? IndexNumberEnd { get; set; } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/EpisodeInfo.cs b/MediaBrowser.Controller/Providers/EpisodeInfo.cs new file mode 100644 index 000000000..88a7cbab7 --- /dev/null +++ b/MediaBrowser.Controller/Providers/EpisodeInfo.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Controller.Providers +{ + public class EpisodeInfo : ItemLookupInfo, IHasIdentities<EpisodeIdentity> + { + private List<EpisodeIdentity> _identities = new List<EpisodeIdentity>(); + + public Dictionary<string, string> SeriesProviderIds { get; set; } + + public int? IndexNumberEnd { get; set; } + public int? AnimeSeriesIndex { get; set; } + + public EpisodeInfo() + { + SeriesProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); + } + + public IEnumerable<EpisodeIdentity> Identities + { + get { return _identities; } + } + + public async Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken) + { + var identifier = new ItemIdentifier<EpisodeInfo, EpisodeIdentity>(); + _identities = (await identifier.FindIdentities(this, providerManager, cancellationToken)).ToList(); + } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/ExtraInfo.cs b/MediaBrowser.Controller/Providers/ExtraInfo.cs new file mode 100644 index 000000000..1fbe6e93a --- /dev/null +++ b/MediaBrowser.Controller/Providers/ExtraInfo.cs @@ -0,0 +1,15 @@ +using MediaBrowser.Model.Entities; + +namespace MediaBrowser.Controller.Providers +{ + public class ExtraInfo + { + public string Path { get; set; } + + public LocationType LocationType { get; set; } + + public bool IsDownloadable { get; set; } + + public ExtraType ExtraType { get; set; } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/ExtraSource.cs b/MediaBrowser.Controller/Providers/ExtraSource.cs new file mode 100644 index 000000000..901af60f8 --- /dev/null +++ b/MediaBrowser.Controller/Providers/ExtraSource.cs @@ -0,0 +1,9 @@ +namespace MediaBrowser.Controller.Providers +{ + public enum ExtraSource + { + Local = 1, + Metadata = 2, + Remote = 3 + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/GameInfo.cs b/MediaBrowser.Controller/Providers/GameInfo.cs new file mode 100644 index 000000000..771cf6cec --- /dev/null +++ b/MediaBrowser.Controller/Providers/GameInfo.cs @@ -0,0 +1,11 @@ +namespace MediaBrowser.Controller.Providers +{ + public class GameInfo : ItemLookupInfo + { + /// <summary> + /// Gets or sets the game system. + /// </summary> + /// <value>The game system.</value> + public string GameSystem { get; set; } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/GameSystemInfo.cs b/MediaBrowser.Controller/Providers/GameSystemInfo.cs new file mode 100644 index 000000000..efe2635cd --- /dev/null +++ b/MediaBrowser.Controller/Providers/GameSystemInfo.cs @@ -0,0 +1,11 @@ +namespace MediaBrowser.Controller.Providers +{ + public class GameSystemInfo : ItemLookupInfo + { + /// <summary> + /// Gets or sets the path. + /// </summary> + /// <value>The path.</value> + public string Path { get; set; } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/ICustomMetadataProvider.cs b/MediaBrowser.Controller/Providers/ICustomMetadataProvider.cs index 3ce6ac46b..c9393f4c3 100644 --- a/MediaBrowser.Controller/Providers/ICustomMetadataProvider.cs +++ b/MediaBrowser.Controller/Providers/ICustomMetadataProvider.cs @@ -21,9 +21,4 @@ namespace MediaBrowser.Controller.Providers /// <returns>Task{ItemUpdateType}.</returns> Task<ItemUpdateType> FetchAsync(TItemType item, MetadataRefreshOptions options, CancellationToken cancellationToken); } - - public interface IPreRefreshProvider : ICustomMetadataProvider - { - - } } diff --git a/MediaBrowser.Controller/Providers/IDirectoryService.cs b/MediaBrowser.Controller/Providers/IDirectoryService.cs new file mode 100644 index 000000000..343cf361f --- /dev/null +++ b/MediaBrowser.Controller/Providers/IDirectoryService.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using System.IO; + +namespace MediaBrowser.Controller.Providers +{ + public interface IDirectoryService + { + IEnumerable<FileSystemInfo> GetFileSystemEntries(string path); + IEnumerable<FileSystemInfo> GetFiles(string path); + IEnumerable<FileSystemInfo> GetDirectories(string path); + IEnumerable<FileSystemInfo> GetFiles(string path, bool clearCache); + FileSystemInfo GetFile(string path); + Dictionary<string, FileSystemInfo> GetFileSystemDictionary(string path); + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/IDynamicImageProvider.cs b/MediaBrowser.Controller/Providers/IDynamicImageProvider.cs new file mode 100644 index 000000000..9c3f94763 --- /dev/null +++ b/MediaBrowser.Controller/Providers/IDynamicImageProvider.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Model.Entities; + +namespace MediaBrowser.Controller.Providers +{ + public interface IDynamicImageProvider : IImageProvider + { + /// <summary> + /// Gets the supported images. + /// </summary> + /// <param name="item">The item.</param> + /// <returns>IEnumerable{ImageType}.</returns> + IEnumerable<ImageType> GetSupportedImages(IHasImages item); + + /// <summary> + /// Gets the image. + /// </summary> + /// <param name="item">The item.</param> + /// <param name="type">The type.</param> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns>Task{DynamicImageResponse}.</returns> + Task<DynamicImageResponse> GetImage(IHasImages item, ImageType type, CancellationToken cancellationToken); + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/IExtrasProvider.cs b/MediaBrowser.Controller/Providers/IExtrasProvider.cs index 953bf02a1..3b72232c2 100644 --- a/MediaBrowser.Controller/Providers/IExtrasProvider.cs +++ b/MediaBrowser.Controller/Providers/IExtrasProvider.cs @@ -1,5 +1,4 @@ using MediaBrowser.Controller.Entities; -using MediaBrowser.Model.Entities; namespace MediaBrowser.Controller.Providers { @@ -18,22 +17,4 @@ namespace MediaBrowser.Controller.Providers /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns> bool Supports(IHasMetadata item); } - - public enum ExtraSource - { - Local = 1, - Metadata = 2, - Remote = 3 - } - - public class ExtraInfo - { - public string Path { get; set; } - - public LocationType LocationType { get; set; } - - public bool IsDownloadable { get; set; } - - public ExtraType ExtraType { get; set; } - } } diff --git a/MediaBrowser.Controller/Providers/IHasChangeMonitor.cs b/MediaBrowser.Controller/Providers/IHasChangeMonitor.cs index d914abf61..aa0b0e3c9 100644 --- a/MediaBrowser.Controller/Providers/IHasChangeMonitor.cs +++ b/MediaBrowser.Controller/Providers/IHasChangeMonitor.cs @@ -14,16 +14,4 @@ namespace MediaBrowser.Controller.Providers /// <returns><c>true</c> if the specified item has changed; otherwise, <c>false</c>.</returns> bool HasChanged(IHasMetadata item, IDirectoryService directoryService, DateTime date); } - - public interface IHasItemChangeMonitor - { - /// <summary> - /// Determines whether the specified item has changed. - /// </summary> - /// <param name="item">The item.</param> - /// <param name="status">The status.</param> - /// <param name="directoryService">The directory service.</param> - /// <returns><c>true</c> if the specified item has changed; otherwise, <c>false</c>.</returns> - bool HasChanged(IHasMetadata item, MetadataStatus status, IDirectoryService directoryService); - } } diff --git a/MediaBrowser.Controller/Providers/IHasIdentities.cs b/MediaBrowser.Controller/Providers/IHasIdentities.cs new file mode 100644 index 000000000..36f940dd3 --- /dev/null +++ b/MediaBrowser.Controller/Providers/IHasIdentities.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Controller.Providers +{ + public interface IHasIdentities<out TIdentity> + where TIdentity : IItemIdentity + { + IEnumerable<TIdentity> Identities { get; } + + Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken); + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/IHasItemChangeMonitor.cs b/MediaBrowser.Controller/Providers/IHasItemChangeMonitor.cs new file mode 100644 index 000000000..4c7069dd6 --- /dev/null +++ b/MediaBrowser.Controller/Providers/IHasItemChangeMonitor.cs @@ -0,0 +1,16 @@ +using MediaBrowser.Controller.Entities; + +namespace MediaBrowser.Controller.Providers +{ + public interface IHasItemChangeMonitor + { + /// <summary> + /// Determines whether the specified item has changed. + /// </summary> + /// <param name="item">The item.</param> + /// <param name="status">The status.</param> + /// <param name="directoryService">The directory service.</param> + /// <returns><c>true</c> if the specified item has changed; otherwise, <c>false</c>.</returns> + bool HasChanged(IHasMetadata item, MetadataStatus status, IDirectoryService directoryService); + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/IHasLookupInfo.cs b/MediaBrowser.Controller/Providers/IHasLookupInfo.cs new file mode 100644 index 000000000..afce49852 --- /dev/null +++ b/MediaBrowser.Controller/Providers/IHasLookupInfo.cs @@ -0,0 +1,8 @@ +namespace MediaBrowser.Controller.Providers +{ + public interface IHasLookupInfo<out TLookupInfoType> + where TLookupInfoType : ItemLookupInfo, new() + { + TLookupInfoType GetLookupInfo(); + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/IHasOrder.cs b/MediaBrowser.Controller/Providers/IHasOrder.cs new file mode 100644 index 000000000..cb5298dd3 --- /dev/null +++ b/MediaBrowser.Controller/Providers/IHasOrder.cs @@ -0,0 +1,7 @@ +namespace MediaBrowser.Controller.Providers +{ + public interface IHasOrder + { + int Order { get; } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/IImageEnhancer.cs b/MediaBrowser.Controller/Providers/IImageEnhancer.cs index 56f8d02be..e5a51a56e 100644 --- a/MediaBrowser.Controller/Providers/IImageEnhancer.cs +++ b/MediaBrowser.Controller/Providers/IImageEnhancer.cs @@ -44,11 +44,12 @@ namespace MediaBrowser.Controller.Providers /// Enhances the image async. /// </summary> /// <param name="item">The item.</param> - /// <param name="originalImage">The original image.</param> + /// <param name="inputFile">The input file.</param> + /// <param name="outputFile">The output file.</param> /// <param name="imageType">Type of the image.</param> /// <param name="imageIndex">Index of the image.</param> /// <returns>Task{Image}.</returns> /// <exception cref="System.ArgumentNullException"></exception> - Task<ImageStream> EnhanceImageAsync(IHasImages item, ImageStream originalImage, ImageType imageType, int imageIndex); + Task EnhanceImageAsync(IHasImages item, string inputFile, string outputFile, ImageType imageType, int imageIndex); } }
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/IImageFileSaver.cs b/MediaBrowser.Controller/Providers/IImageFileSaver.cs new file mode 100644 index 000000000..3e11d8bf8 --- /dev/null +++ b/MediaBrowser.Controller/Providers/IImageFileSaver.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Model.Drawing; +using MediaBrowser.Model.Entities; + +namespace MediaBrowser.Controller.Providers +{ + public interface IImageFileSaver : IImageSaver + { + /// <summary> + /// Gets the save paths. + /// </summary> + /// <param name="item">The item.</param> + /// <param name="type">The type.</param> + /// <param name="format">The format.</param> + /// <param name="index">The index.</param> + /// <returns>IEnumerable{System.String}.</returns> + IEnumerable<string> GetSavePaths(IHasImages item, ImageType type, ImageFormat format, int index); + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/IImageSaver.cs b/MediaBrowser.Controller/Providers/IImageSaver.cs index a983de63e..62017160f 100644 --- a/MediaBrowser.Controller/Providers/IImageSaver.cs +++ b/MediaBrowser.Controller/Providers/IImageSaver.cs @@ -1,9 +1,4 @@ -using MediaBrowser.Controller.Entities; -using MediaBrowser.Model.Drawing; -using MediaBrowser.Model.Entities; -using System.Collections.Generic; - -namespace MediaBrowser.Controller.Providers +namespace MediaBrowser.Controller.Providers { public interface IImageSaver { @@ -13,17 +8,4 @@ namespace MediaBrowser.Controller.Providers /// <value>The name.</value> string Name { get; } } - - public interface IImageFileSaver : IImageSaver - { - /// <summary> - /// Gets the save paths. - /// </summary> - /// <param name="item">The item.</param> - /// <param name="type">The type.</param> - /// <param name="format">The format.</param> - /// <param name="index">The index.</param> - /// <returns>IEnumerable{System.String}.</returns> - IEnumerable<string> GetSavePaths(IHasImages item, ImageType type, ImageFormat format, int index); - } } diff --git a/MediaBrowser.Controller/Providers/IItemIdentity.cs b/MediaBrowser.Controller/Providers/IItemIdentity.cs new file mode 100644 index 000000000..cab189c84 --- /dev/null +++ b/MediaBrowser.Controller/Providers/IItemIdentity.cs @@ -0,0 +1,7 @@ +namespace MediaBrowser.Controller.Providers +{ + public interface IItemIdentity + { + string Type { get; } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/IItemIdentityConverter.cs b/MediaBrowser.Controller/Providers/IItemIdentityConverter.cs new file mode 100644 index 000000000..30e96b9e5 --- /dev/null +++ b/MediaBrowser.Controller/Providers/IItemIdentityConverter.cs @@ -0,0 +1,4 @@ +namespace MediaBrowser.Controller.Providers +{ + public interface IItemIdentityConverter : IHasOrder { } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/IItemIdentityProvider.cs b/MediaBrowser.Controller/Providers/IItemIdentityProvider.cs new file mode 100644 index 000000000..9d437c208 --- /dev/null +++ b/MediaBrowser.Controller/Providers/IItemIdentityProvider.cs @@ -0,0 +1,4 @@ +namespace MediaBrowser.Controller.Providers +{ + public interface IItemIdentityProvider : IHasOrder { } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/ILocalImageFileProvider.cs b/MediaBrowser.Controller/Providers/ILocalImageFileProvider.cs new file mode 100644 index 000000000..7e5d82843 --- /dev/null +++ b/MediaBrowser.Controller/Providers/ILocalImageFileProvider.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using MediaBrowser.Controller.Entities; + +namespace MediaBrowser.Controller.Providers +{ + public interface ILocalImageFileProvider : ILocalImageProvider + { + List<LocalImageInfo> GetImages(IHasImages item, IDirectoryService directoryService); + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/ILocalImageProvider.cs b/MediaBrowser.Controller/Providers/ILocalImageProvider.cs index d1345d7a6..1027a4cb2 100644 --- a/MediaBrowser.Controller/Providers/ILocalImageProvider.cs +++ b/MediaBrowser.Controller/Providers/ILocalImageProvider.cs @@ -1,13 +1,4 @@ -using MediaBrowser.Controller.Entities; -using MediaBrowser.Model.Drawing; -using MediaBrowser.Model.Entities; -using System; -using System.Collections.Generic; -using System.IO; -using System.Threading; -using System.Threading.Tasks; - -namespace MediaBrowser.Controller.Providers +namespace MediaBrowser.Controller.Providers { /// <summary> /// This is just a marker interface @@ -15,68 +6,4 @@ namespace MediaBrowser.Controller.Providers public interface ILocalImageProvider : IImageProvider { } - - public interface ILocalImageFileProvider : ILocalImageProvider - { - List<LocalImageInfo> GetImages(IHasImages item, IDirectoryService directoryService); - } - - public class LocalImageInfo - { - public FileSystemInfo FileInfo { get; set; } - public ImageType Type { get; set; } - } - - public interface IDynamicImageProvider : IImageProvider - { - /// <summary> - /// Gets the supported images. - /// </summary> - /// <param name="item">The item.</param> - /// <returns>IEnumerable{ImageType}.</returns> - IEnumerable<ImageType> GetSupportedImages(IHasImages item); - - /// <summary> - /// Gets the image. - /// </summary> - /// <param name="item">The item.</param> - /// <param name="type">The type.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task{DynamicImageResponse}.</returns> - Task<DynamicImageResponse> GetImage(IHasImages item, ImageType type, CancellationToken cancellationToken); - } - - public class DynamicImageInfo - { - public string ImageId { get; set; } - public ImageType Type { get; set; } - } - - public class DynamicImageResponse - { - public string Path { get; set; } - public Stream Stream { get; set; } - public ImageFormat Format { get; set; } - public bool HasImage { get; set; } - - public void SetFormatFromMimeType(string mimeType) - { - if (mimeType.EndsWith("gif", StringComparison.OrdinalIgnoreCase)) - { - Format = ImageFormat.Gif; - } - else if (mimeType.EndsWith("bmp", StringComparison.OrdinalIgnoreCase)) - { - Format = ImageFormat.Bmp; - } - else if (mimeType.EndsWith("png", StringComparison.OrdinalIgnoreCase)) - { - Format = ImageFormat.Png; - } - else - { - Format = ImageFormat.Jpg; - } - } - } } diff --git a/MediaBrowser.Controller/Providers/ILocalMetadataProvider.cs b/MediaBrowser.Controller/Providers/ILocalMetadataProvider.cs index 61bc3b87b..3a8ef7325 100644 --- a/MediaBrowser.Controller/Providers/ILocalMetadataProvider.cs +++ b/MediaBrowser.Controller/Providers/ILocalMetadataProvider.cs @@ -1,6 +1,4 @@ using MediaBrowser.Controller.Entities; -using MediaBrowser.Model.Entities; -using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -24,29 +22,4 @@ namespace MediaBrowser.Controller.Providers IDirectoryService directoryService, CancellationToken cancellationToken); } - - public class ItemInfo - { - public string Path { get; set; } - - public bool IsInMixedFolder { get; set; } - } - - public class LocalMetadataResult<T> - where T : IHasMetadata - { - public bool HasMetadata { get; set; } - public T Item { get; set; } - - public List<LocalImageInfo> Images { get; set; } - public List<ChapterInfo> Chapters { get; set; } - public List<UserItemData> UserDataLIst { get; set; } - - public LocalMetadataResult() - { - Images = new List<LocalImageInfo>(); - Chapters = new List<ChapterInfo>(); - UserDataLIst = new List<UserItemData>(); - } - } } diff --git a/MediaBrowser.Controller/Providers/IMetadataProvider.cs b/MediaBrowser.Controller/Providers/IMetadataProvider.cs index 52cd6fcea..26f43d820 100644 --- a/MediaBrowser.Controller/Providers/IMetadataProvider.cs +++ b/MediaBrowser.Controller/Providers/IMetadataProvider.cs @@ -19,15 +19,4 @@ namespace MediaBrowser.Controller.Providers where TItemType : IHasMetadata { } - - public interface IHasOrder - { - int Order { get; } - } - - public class MetadataResult<T> - { - public bool HasMetadata { get; set; } - public T Item { get; set; } - } } diff --git a/MediaBrowser.Controller/Providers/IMetadataService.cs b/MediaBrowser.Controller/Providers/IMetadataService.cs index 786a7147c..2d4873f7e 100644 --- a/MediaBrowser.Controller/Providers/IMetadataService.cs +++ b/MediaBrowser.Controller/Providers/IMetadataService.cs @@ -1,6 +1,7 @@ -using System.Threading; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Library; +using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Controller.Entities; namespace MediaBrowser.Controller.Providers { @@ -20,7 +21,7 @@ namespace MediaBrowser.Controller.Providers /// <param name="refreshOptions">The options.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task.</returns> - Task RefreshMetadata(IHasMetadata item, MetadataRefreshOptions refreshOptions, CancellationToken cancellationToken); + Task<ItemUpdateType> RefreshMetadata(IHasMetadata item, MetadataRefreshOptions refreshOptions, CancellationToken cancellationToken); /// <summary> /// Gets the order. diff --git a/MediaBrowser.Controller/Providers/IPreRefreshProvider.cs b/MediaBrowser.Controller/Providers/IPreRefreshProvider.cs new file mode 100644 index 000000000..608674905 --- /dev/null +++ b/MediaBrowser.Controller/Providers/IPreRefreshProvider.cs @@ -0,0 +1,7 @@ +namespace MediaBrowser.Controller.Providers +{ + public interface IPreRefreshProvider : ICustomMetadataProvider + { + + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/IProviderManager.cs b/MediaBrowser.Controller/Providers/IProviderManager.cs index 3cb745ff4..d40fa835f 100644 --- a/MediaBrowser.Controller/Providers/IProviderManager.cs +++ b/MediaBrowser.Controller/Providers/IProviderManager.cs @@ -4,6 +4,7 @@ using MediaBrowser.Controller.Library; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Providers; +using System; using System.Collections.Generic; using System.IO; using System.Threading; @@ -17,13 +18,29 @@ namespace MediaBrowser.Controller.Providers public interface IProviderManager { /// <summary> + /// Queues the refresh. + /// </summary> + /// <param name="itemId">The item identifier.</param> + /// <param name="options">The options.</param> + void QueueRefresh(Guid itemId, MetadataRefreshOptions options); + + /// <summary> + /// Refreshes the full item. + /// </summary> + /// <param name="item">The item.</param> + /// <param name="options">The options.</param> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns>Task.</returns> + Task RefreshFullItem(IHasMetadata item, MetadataRefreshOptions options, CancellationToken cancellationToken); + + /// <summary> /// Refreshes the metadata. /// </summary> /// <param name="item">The item.</param> /// <param name="options">The options.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task.</returns> - Task RefreshMetadata(IHasMetadata item, MetadataRefreshOptions options, CancellationToken cancellationToken); + Task<ItemUpdateType> RefreshSingleItem(IHasMetadata item, MetadataRefreshOptions options, CancellationToken cancellationToken); /// <summary> /// Saves the image. diff --git a/MediaBrowser.Controller/Providers/IRemoteMetadataProvider.cs b/MediaBrowser.Controller/Providers/IRemoteMetadataProvider.cs index 0ff7ee5a9..5e2e1b4c7 100644 --- a/MediaBrowser.Controller/Providers/IRemoteMetadataProvider.cs +++ b/MediaBrowser.Controller/Providers/IRemoteMetadataProvider.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Common.Net; -using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities; using MediaBrowser.Model.Providers; using System.Collections.Generic; using System.Threading; @@ -18,37 +17,9 @@ namespace MediaBrowser.Controller.Providers Task<MetadataResult<TItemType>> GetMetadata(TLookupInfoType info, CancellationToken cancellationToken); } - public interface IRemoteSearchProvider : IMetadataProvider - { - /// <summary> - /// Gets the image response. - /// </summary> - /// <param name="url">The URL.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task{HttpResponseInfo}.</returns> - Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken); - } - public interface IRemoteSearchProvider<in TLookupInfoType> : IRemoteSearchProvider where TLookupInfoType : ItemLookupInfo { Task<IEnumerable<RemoteSearchResult>> GetSearchResults(TLookupInfoType searchInfo, CancellationToken cancellationToken); } - - public class RemoteSearchQuery<T> - where T : ItemLookupInfo - { - public T SearchInfo { get; set; } - - /// <summary> - /// If set will only search within the given provider - /// </summary> - public string SearchProviderName { get; set; } - - /// <summary> - /// Gets or sets a value indicating whether [include disabled providers]. - /// </summary> - /// <value><c>true</c> if [include disabled providers]; otherwise, <c>false</c>.</value> - public bool IncludeDisabledProviders { get; set; } - } } diff --git a/MediaBrowser.Controller/Providers/IRemoteSearchProvider.cs b/MediaBrowser.Controller/Providers/IRemoteSearchProvider.cs new file mode 100644 index 000000000..0077def42 --- /dev/null +++ b/MediaBrowser.Controller/Providers/IRemoteSearchProvider.cs @@ -0,0 +1,17 @@ +using System.Threading; +using System.Threading.Tasks; +using MediaBrowser.Common.Net; + +namespace MediaBrowser.Controller.Providers +{ + public interface IRemoteSearchProvider : IMetadataProvider + { + /// <summary> + /// Gets the image response. + /// </summary> + /// <param name="url">The URL.</param> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns>Task{HttpResponseInfo}.</returns> + Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken); + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/ISeriesOrderManager.cs b/MediaBrowser.Controller/Providers/ISeriesOrderManager.cs index a3adab1b9..235d0ada5 100644 --- a/MediaBrowser.Controller/Providers/ISeriesOrderManager.cs +++ b/MediaBrowser.Controller/Providers/ISeriesOrderManager.cs @@ -7,17 +7,6 @@ using MediaBrowser.Common; namespace MediaBrowser.Controller.Providers { - public interface ISeriesOrderProvider - { - string OrderType { get; } - Task<int?> FindSeriesIndex(string seriesName); - } - - public static class SeriesOrderTypes - { - public const string Anime = "Anime"; - } - public interface ISeriesOrderManager { Task<int?> FindSeriesIndex(string orderType, string seriesName); diff --git a/MediaBrowser.Controller/Providers/ISeriesOrderProvider.cs b/MediaBrowser.Controller/Providers/ISeriesOrderProvider.cs new file mode 100644 index 000000000..ee0f3c197 --- /dev/null +++ b/MediaBrowser.Controller/Providers/ISeriesOrderProvider.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; + +namespace MediaBrowser.Controller.Providers +{ + public interface ISeriesOrderProvider + { + string OrderType { get; } + Task<int?> FindSeriesIndex(string seriesName); + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/ImageRefreshMode.cs b/MediaBrowser.Controller/Providers/ImageRefreshMode.cs new file mode 100644 index 000000000..df10c91f6 --- /dev/null +++ b/MediaBrowser.Controller/Providers/ImageRefreshMode.cs @@ -0,0 +1,25 @@ +namespace MediaBrowser.Controller.Providers +{ + public enum ImageRefreshMode + { + /// <summary> + /// The none + /// </summary> + None = 0, + + /// <summary> + /// The default + /// </summary> + Default = 1, + + /// <summary> + /// Existing images will be validated + /// </summary> + ValidationOnly = 2, + + /// <summary> + /// All providers will be executed to search for new metadata + /// </summary> + FullRefresh = 3 + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/ImageRefreshOptions.cs b/MediaBrowser.Controller/Providers/ImageRefreshOptions.cs new file mode 100644 index 000000000..a66cc6f22 --- /dev/null +++ b/MediaBrowser.Controller/Providers/ImageRefreshOptions.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; +using MediaBrowser.Model.Entities; + +namespace MediaBrowser.Controller.Providers +{ + public class ImageRefreshOptions + { + public ImageRefreshMode ImageRefreshMode { get; set; } + public IDirectoryService DirectoryService { get; private set; } + + public bool ReplaceAllImages { get; set; } + + public List<ImageType> ReplaceImages { get; set; } + + public ImageRefreshOptions(IDirectoryService directoryService) + { + ImageRefreshMode = ImageRefreshMode.Default; + DirectoryService = directoryService; + + ReplaceImages = new List<ImageType>(); + } + + public bool IsReplacingImage(ImageType type) + { + return ImageRefreshMode == ImageRefreshMode.FullRefresh && + (ReplaceAllImages || ReplaceImages.Contains(type)); + } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/ItemIdentities.cs b/MediaBrowser.Controller/Providers/ItemIdentities.cs index 8d24f6c1f..939fd3b8f 100644 --- a/MediaBrowser.Controller/Providers/ItemIdentities.cs +++ b/MediaBrowser.Controller/Providers/ItemIdentities.cs @@ -1,24 +1,7 @@ -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; +using System.Threading.Tasks; namespace MediaBrowser.Controller.Providers { - public interface IItemIdentity - { - string Type { get; } - } - - public interface IHasIdentities<out TIdentity> - where TIdentity : IItemIdentity - { - IEnumerable<TIdentity> Identities { get; } - - Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken); - } - - public interface IItemIdentityProvider : IHasOrder { } - public interface IItemIdentityProvider<in TLookupInfo, TIdentity> : IItemIdentityProvider where TLookupInfo : ItemLookupInfo where TIdentity : IItemIdentity @@ -26,8 +9,6 @@ namespace MediaBrowser.Controller.Providers Task<TIdentity> FindIdentity(TLookupInfo info); } - public interface IItemIdentityConverter : IHasOrder { } - public interface IItemIdentityConverter<TIdentity> : IItemIdentityConverter where TIdentity : IItemIdentity { diff --git a/MediaBrowser.Controller/Providers/ItemInfo.cs b/MediaBrowser.Controller/Providers/ItemInfo.cs new file mode 100644 index 000000000..113a7bb8e --- /dev/null +++ b/MediaBrowser.Controller/Providers/ItemInfo.cs @@ -0,0 +1,9 @@ +namespace MediaBrowser.Controller.Providers +{ + public class ItemInfo + { + public string Path { get; set; } + + public bool IsInMixedFolder { get; set; } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/ItemLookupInfo.cs b/MediaBrowser.Controller/Providers/ItemLookupInfo.cs index 43b921092..91dc33214 100644 --- a/MediaBrowser.Controller/Providers/ItemLookupInfo.cs +++ b/MediaBrowser.Controller/Providers/ItemLookupInfo.cs @@ -1,8 +1,4 @@ -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using MediaBrowser.Model.Channels; -using MediaBrowser.Model.Entities; +using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; @@ -43,204 +39,4 @@ namespace MediaBrowser.Controller.Providers ProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); } } - - public interface IHasLookupInfo<out TLookupInfoType> - where TLookupInfoType : ItemLookupInfo, new() - { - TLookupInfoType GetLookupInfo(); - } - - public class ArtistInfo : ItemLookupInfo - { - public List<SongInfo> SongInfos { get; set; } - - public ArtistInfo() - { - SongInfos = new List<SongInfo>(); - } - } - - public class AlbumInfo : ItemLookupInfo - { - /// <summary> - /// Gets or sets the album artist. - /// </summary> - /// <value>The album artist.</value> - public List<string> AlbumArtists { get; set; } - - /// <summary> - /// Gets or sets the artist provider ids. - /// </summary> - /// <value>The artist provider ids.</value> - public Dictionary<string, string> ArtistProviderIds { get; set; } - public List<SongInfo> SongInfos { get; set; } - - public AlbumInfo() - { - ArtistProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); - SongInfos = new List<SongInfo>(); - AlbumArtists = new List<string>(); - } - } - - public class GameInfo : ItemLookupInfo - { - /// <summary> - /// Gets or sets the game system. - /// </summary> - /// <value>The game system.</value> - public string GameSystem { get; set; } - } - - public class GameSystemInfo : ItemLookupInfo - { - /// <summary> - /// Gets or sets the path. - /// </summary> - /// <value>The path.</value> - public string Path { get; set; } - } - - public class EpisodeInfo : ItemLookupInfo, IHasIdentities<EpisodeIdentity> - { - private List<EpisodeIdentity> _identities = new List<EpisodeIdentity>(); - - public Dictionary<string, string> SeriesProviderIds { get; set; } - - public int? IndexNumberEnd { get; set; } - public int? AnimeSeriesIndex { get; set; } - - public EpisodeInfo() - { - SeriesProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); - } - - public IEnumerable<EpisodeIdentity> Identities - { - get { return _identities; } - } - - public async Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken) - { - var identifier = new ItemIdentifier<EpisodeInfo, EpisodeIdentity>(); - _identities = (await identifier.FindIdentities(this, providerManager, cancellationToken)).ToList(); - } - } - - public class EpisodeIdentity : IItemIdentity - { - public string Type { get; set; } - - public string SeriesId { get; set; } - public int? SeasonIndex { get; set; } - public int IndexNumber { get; set; } - public int? IndexNumberEnd { get; set; } - } - - public class SongInfo : ItemLookupInfo - { - public List<string> AlbumArtists { get; set; } - public string Album { get; set; } - public List<string> Artists { get; set; } - - public SongInfo() - { - Artists = new List<string>(); - AlbumArtists = new List<string>(); - } - } - - public class SeriesInfo : ItemLookupInfo, IHasIdentities<SeriesIdentity> - { - private List<SeriesIdentity> _identities = new List<SeriesIdentity>(); - - public int? AnimeSeriesIndex { get; set; } - - public IEnumerable<SeriesIdentity> Identities - { - get { return _identities; } - } - - public async Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken) - { - var identifier = new ItemIdentifier<SeriesInfo, SeriesIdentity>(); - _identities = (await identifier.FindIdentities(this, providerManager, cancellationToken)).ToList(); - } - } - - public class SeriesIdentity : IItemIdentity - { - public string Type { get; set; } - - public string Id { get; set; } - } - - public class PersonLookupInfo : ItemLookupInfo - { - - } - - public class MovieInfo : ItemLookupInfo - { - - } - - public class BoxSetInfo : ItemLookupInfo - { - - } - - public class MusicVideoInfo : ItemLookupInfo - { - - } - - public class TrailerInfo : ItemLookupInfo - { - public bool IsLocalTrailer { get; set; } - } - - public class BookInfo : ItemLookupInfo - { - public string SeriesName { get; set; } - } - - public class SeasonInfo : ItemLookupInfo, IHasIdentities<SeasonIdentity> - { - private List<SeasonIdentity> _identities = new List<SeasonIdentity>(); - - public Dictionary<string, string> SeriesProviderIds { get; set; } - public int? AnimeSeriesIndex { get; set; } - - public SeasonInfo() - { - SeriesProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); - } - - public IEnumerable<SeasonIdentity> Identities - { - get { return _identities; } - } - - public async Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken) - { - var identifier = new ItemIdentifier<SeasonInfo, SeasonIdentity>(); - _identities = (await identifier.FindIdentities(this, providerManager, cancellationToken)).ToList(); - } - } - - public class SeasonIdentity : IItemIdentity - { - public string Type { get; set; } - - public string SeriesId { get; set; } - - public int SeasonIndex { get; set; } - } - - public class ChannelItemLookupInfo : ItemLookupInfo - { - public ChannelMediaContentType ContentType { get; set; } - public ExtraType ExtraType { get; set; } - } } diff --git a/MediaBrowser.Controller/Providers/LiveTvProgramLookupInfo.cs b/MediaBrowser.Controller/Providers/LiveTvProgramLookupInfo.cs new file mode 100644 index 000000000..4e2c11c22 --- /dev/null +++ b/MediaBrowser.Controller/Providers/LiveTvProgramLookupInfo.cs @@ -0,0 +1,9 @@ +using System; + +namespace MediaBrowser.Controller.Providers +{ + public class LiveTvProgramLookupInfo : ItemLookupInfo + { + public Boolean IsMovie { get; set; } + } +} diff --git a/MediaBrowser.Controller/Providers/LocalImageInfo.cs b/MediaBrowser.Controller/Providers/LocalImageInfo.cs new file mode 100644 index 000000000..59d74def2 --- /dev/null +++ b/MediaBrowser.Controller/Providers/LocalImageInfo.cs @@ -0,0 +1,11 @@ +using System.IO; +using MediaBrowser.Model.Entities; + +namespace MediaBrowser.Controller.Providers +{ + public class LocalImageInfo + { + public FileSystemInfo FileInfo { get; set; } + public ImageType Type { get; set; } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/LocalMetadataResult.cs b/MediaBrowser.Controller/Providers/LocalMetadataResult.cs new file mode 100644 index 000000000..8be3ee7aa --- /dev/null +++ b/MediaBrowser.Controller/Providers/LocalMetadataResult.cs @@ -0,0 +1,24 @@ +using System.Collections.Generic; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Model.Entities; + +namespace MediaBrowser.Controller.Providers +{ + public class LocalMetadataResult<T> + where T : IHasMetadata + { + public bool HasMetadata { get; set; } + public T Item { get; set; } + + public List<LocalImageInfo> Images { get; set; } + public List<ChapterInfo> Chapters { get; set; } + public List<UserItemData> UserDataLIst { get; set; } + + public LocalMetadataResult() + { + Images = new List<LocalImageInfo>(); + Chapters = new List<ChapterInfo>(); + UserDataLIst = new List<UserItemData>(); + } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/MetadataRefreshMode.cs b/MediaBrowser.Controller/Providers/MetadataRefreshMode.cs new file mode 100644 index 000000000..56492006a --- /dev/null +++ b/MediaBrowser.Controller/Providers/MetadataRefreshMode.cs @@ -0,0 +1,25 @@ +namespace MediaBrowser.Controller.Providers +{ + public enum MetadataRefreshMode + { + /// <summary> + /// The none + /// </summary> + None = 0, + + /// <summary> + /// The validation only + /// </summary> + ValidationOnly = 1, + + /// <summary> + /// Providers will be executed based on default rules + /// </summary> + Default = 2, + + /// <summary> + /// All providers will be executed to search for new metadata + /// </summary> + FullRefresh = 3 + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs b/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs index 2cd119cf5..dbb7fbfcd 100644 --- a/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs +++ b/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs @@ -1,6 +1,4 @@ -using MediaBrowser.Model.Entities; -using System.Collections.Generic; -using System.Linq; +using System.Linq; namespace MediaBrowser.Controller.Providers { @@ -12,7 +10,7 @@ namespace MediaBrowser.Controller.Providers public bool ReplaceAllMetadata { get; set; } public bool IsPostRecursiveRefresh { get; set; } - + public MetadataRefreshMode MetadataRefreshMode { get; set; } public bool ForceSave { get; set; } @@ -28,7 +26,7 @@ namespace MediaBrowser.Controller.Providers MetadataRefreshMode = MetadataRefreshMode.Default; } - public MetadataRefreshOptions( MetadataRefreshOptions copy) + public MetadataRefreshOptions(MetadataRefreshOptions copy) : base(copy.DirectoryService) { MetadataRefreshMode = copy.MetadataRefreshMode; @@ -40,74 +38,4 @@ namespace MediaBrowser.Controller.Providers ReplaceImages = copy.ReplaceImages.ToList(); } } - - public class ImageRefreshOptions - { - public ImageRefreshMode ImageRefreshMode { get; set; } - public IDirectoryService DirectoryService { get; private set; } - - public bool ReplaceAllImages { get; set; } - - public List<ImageType> ReplaceImages { get; set; } - - public ImageRefreshOptions(IDirectoryService directoryService) - { - ImageRefreshMode = ImageRefreshMode.Default; - DirectoryService = directoryService; - - ReplaceImages = new List<ImageType>(); - } - - public bool IsReplacingImage(ImageType type) - { - return ImageRefreshMode == ImageRefreshMode.FullRefresh && - (ReplaceAllImages || ReplaceImages.Contains(type)); - } - } - - public enum MetadataRefreshMode - { - /// <summary> - /// The none - /// </summary> - None = 0, - - /// <summary> - /// The validation only - /// </summary> - ValidationOnly = 1, - - /// <summary> - /// Providers will be executed based on default rules - /// </summary> - Default = 2, - - /// <summary> - /// All providers will be executed to search for new metadata - /// </summary> - FullRefresh = 3 - } - - public enum ImageRefreshMode - { - /// <summary> - /// The none - /// </summary> - None = 0, - - /// <summary> - /// The default - /// </summary> - Default = 1, - - /// <summary> - /// Existing images will be validated - /// </summary> - ValidationOnly = 2, - - /// <summary> - /// All providers will be executed to search for new metadata - /// </summary> - FullRefresh = 3 - } } diff --git a/MediaBrowser.Controller/Providers/MetadataResult.cs b/MediaBrowser.Controller/Providers/MetadataResult.cs new file mode 100644 index 000000000..756458cfa --- /dev/null +++ b/MediaBrowser.Controller/Providers/MetadataResult.cs @@ -0,0 +1,8 @@ +namespace MediaBrowser.Controller.Providers +{ + public class MetadataResult<T> + { + public bool HasMetadata { get; set; } + public T Item { get; set; } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/MovieInfo.cs b/MediaBrowser.Controller/Providers/MovieInfo.cs new file mode 100644 index 000000000..198336fc0 --- /dev/null +++ b/MediaBrowser.Controller/Providers/MovieInfo.cs @@ -0,0 +1,7 @@ +namespace MediaBrowser.Controller.Providers +{ + public class MovieInfo : ItemLookupInfo + { + + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/MusicVideoInfo.cs b/MediaBrowser.Controller/Providers/MusicVideoInfo.cs new file mode 100644 index 000000000..4f4ab5954 --- /dev/null +++ b/MediaBrowser.Controller/Providers/MusicVideoInfo.cs @@ -0,0 +1,7 @@ +namespace MediaBrowser.Controller.Providers +{ + public class MusicVideoInfo : ItemLookupInfo + { + + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/PersonLookupInfo.cs b/MediaBrowser.Controller/Providers/PersonLookupInfo.cs new file mode 100644 index 000000000..db4dacb0b --- /dev/null +++ b/MediaBrowser.Controller/Providers/PersonLookupInfo.cs @@ -0,0 +1,7 @@ +namespace MediaBrowser.Controller.Providers +{ + public class PersonLookupInfo : ItemLookupInfo + { + + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/RemoteSearchQuery.cs b/MediaBrowser.Controller/Providers/RemoteSearchQuery.cs new file mode 100644 index 000000000..cd86f352f --- /dev/null +++ b/MediaBrowser.Controller/Providers/RemoteSearchQuery.cs @@ -0,0 +1,19 @@ +namespace MediaBrowser.Controller.Providers +{ + public class RemoteSearchQuery<T> + where T : ItemLookupInfo + { + public T SearchInfo { get; set; } + + /// <summary> + /// If set will only search within the given provider + /// </summary> + public string SearchProviderName { get; set; } + + /// <summary> + /// Gets or sets a value indicating whether [include disabled providers]. + /// </summary> + /// <value><c>true</c> if [include disabled providers]; otherwise, <c>false</c>.</value> + public bool IncludeDisabledProviders { get; set; } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/SeasonIdentity.cs b/MediaBrowser.Controller/Providers/SeasonIdentity.cs new file mode 100644 index 000000000..1e6b9b65a --- /dev/null +++ b/MediaBrowser.Controller/Providers/SeasonIdentity.cs @@ -0,0 +1,11 @@ +namespace MediaBrowser.Controller.Providers +{ + public class SeasonIdentity : IItemIdentity + { + public string Type { get; set; } + + public string SeriesId { get; set; } + + public int SeasonIndex { get; set; } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/SeasonInfo.cs b/MediaBrowser.Controller/Providers/SeasonInfo.cs new file mode 100644 index 000000000..17bcd3f77 --- /dev/null +++ b/MediaBrowser.Controller/Providers/SeasonInfo.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Controller.Providers +{ + public class SeasonInfo : ItemLookupInfo, IHasIdentities<SeasonIdentity> + { + private List<SeasonIdentity> _identities = new List<SeasonIdentity>(); + + public Dictionary<string, string> SeriesProviderIds { get; set; } + public int? AnimeSeriesIndex { get; set; } + + public SeasonInfo() + { + SeriesProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); + } + + public IEnumerable<SeasonIdentity> Identities + { + get { return _identities; } + } + + public async Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken) + { + var identifier = new ItemIdentifier<SeasonInfo, SeasonIdentity>(); + _identities = (await identifier.FindIdentities(this, providerManager, cancellationToken)).ToList(); + } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/SeriesIdentity.cs b/MediaBrowser.Controller/Providers/SeriesIdentity.cs new file mode 100644 index 000000000..326d34027 --- /dev/null +++ b/MediaBrowser.Controller/Providers/SeriesIdentity.cs @@ -0,0 +1,9 @@ +namespace MediaBrowser.Controller.Providers +{ + public class SeriesIdentity : IItemIdentity + { + public string Type { get; set; } + + public string Id { get; set; } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/SeriesInfo.cs b/MediaBrowser.Controller/Providers/SeriesInfo.cs new file mode 100644 index 000000000..fc1119cd2 --- /dev/null +++ b/MediaBrowser.Controller/Providers/SeriesInfo.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Controller.Providers +{ + public class SeriesInfo : ItemLookupInfo, IHasIdentities<SeriesIdentity> + { + private List<SeriesIdentity> _identities = new List<SeriesIdentity>(); + + public int? AnimeSeriesIndex { get; set; } + + public IEnumerable<SeriesIdentity> Identities + { + get { return _identities; } + } + + public async Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken) + { + var identifier = new ItemIdentifier<SeriesInfo, SeriesIdentity>(); + _identities = (await identifier.FindIdentities(this, providerManager, cancellationToken)).ToList(); + } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/SeriesOrderTypes.cs b/MediaBrowser.Controller/Providers/SeriesOrderTypes.cs new file mode 100644 index 000000000..5e04fb4db --- /dev/null +++ b/MediaBrowser.Controller/Providers/SeriesOrderTypes.cs @@ -0,0 +1,7 @@ +namespace MediaBrowser.Controller.Providers +{ + public static class SeriesOrderTypes + { + public const string Anime = "Anime"; + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/SongInfo.cs b/MediaBrowser.Controller/Providers/SongInfo.cs new file mode 100644 index 000000000..b83912a00 --- /dev/null +++ b/MediaBrowser.Controller/Providers/SongInfo.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; + +namespace MediaBrowser.Controller.Providers +{ + public class SongInfo : ItemLookupInfo + { + public List<string> AlbumArtists { get; set; } + public string Album { get; set; } + public List<string> Artists { get; set; } + + public SongInfo() + { + Artists = new List<string>(); + AlbumArtists = new List<string>(); + } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/TrailerInfo.cs b/MediaBrowser.Controller/Providers/TrailerInfo.cs new file mode 100644 index 000000000..fe26ec43e --- /dev/null +++ b/MediaBrowser.Controller/Providers/TrailerInfo.cs @@ -0,0 +1,7 @@ +namespace MediaBrowser.Controller.Providers +{ + public class TrailerInfo : ItemLookupInfo + { + public bool IsLocalTrailer { get; set; } + } +}
\ No newline at end of file diff --git a/MediaBrowser.Controller/Security/AuthenticationInfo.cs b/MediaBrowser.Controller/Security/AuthenticationInfo.cs index dd5eec1f9..c2d4a39d1 100644 --- a/MediaBrowser.Controller/Security/AuthenticationInfo.cs +++ b/MediaBrowser.Controller/Security/AuthenticationInfo.cs @@ -29,6 +29,12 @@ namespace MediaBrowser.Controller.Security public string AppName { get; set; } /// <summary> + /// Gets or sets the application version. + /// </summary> + /// <value>The application version.</value> + public string AppVersion { get; set; } + + /// <summary> /// Gets or sets the name of the device. /// </summary> /// <value>The name of the device.</value> diff --git a/MediaBrowser.Controller/Session/ISessionManager.cs b/MediaBrowser.Controller/Session/ISessionManager.cs index 4082f5600..80025171d 100644 --- a/MediaBrowser.Controller/Session/ISessionManager.cs +++ b/MediaBrowser.Controller/Session/ISessionManager.cs @@ -1,5 +1,6 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Security; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Events; using MediaBrowser.Model.Session; @@ -73,7 +74,7 @@ namespace MediaBrowser.Controller.Session /// <summary> /// Logs the user activity. /// </summary> - /// <param name="clientType">Type of the client.</param> + /// <param name="appName">Type of the client.</param> /// <param name="appVersion">The app version.</param> /// <param name="deviceId">The device id.</param> /// <param name="deviceName">Name of the device.</param> @@ -81,7 +82,7 @@ namespace MediaBrowser.Controller.Session /// <param name="user">The user.</param> /// <returns>Task.</returns> /// <exception cref="System.ArgumentNullException">user</exception> - Task<SessionInfo> LogSessionActivity(string clientType, string appVersion, string deviceId, string deviceName, string remoteEndPoint, User user); + Task<SessionInfo> LogSessionActivity(string appName, string appVersion, string deviceId, string deviceName, string remoteEndPoint, User user); /// <summary> /// Used to report that playback has started for an item @@ -279,6 +280,25 @@ namespace MediaBrowser.Controller.Session SessionInfo GetSession(string deviceId, string client, string version); /// <summary> + /// Gets the session by authentication token. + /// </summary> + /// <param name="token">The token.</param> + /// <param name="deviceId">The device identifier.</param> + /// <param name="remoteEndpoint">The remote endpoint.</param> + /// <returns>SessionInfo.</returns> + Task<SessionInfo> GetSessionByAuthenticationToken(string token, string deviceId, string remoteEndpoint); + + /// <summary> + /// Gets the session by authentication token. + /// </summary> + /// <param name="info">The information.</param> + /// <param name="deviceId">The device identifier.</param> + /// <param name="remoteEndpoint">The remote endpoint.</param> + /// <param name="appVersion">The application version.</param> + /// <returns>Task<SessionInfo>.</returns> + Task<SessionInfo> GetSessionByAuthenticationToken(AuthenticationInfo info, string deviceId, string remoteEndpoint, string appVersion); + + /// <summary> /// Logouts the specified access token. /// </summary> /// <param name="accessToken">The access token.</param> diff --git a/MediaBrowser.Controller/Session/SessionInfo.cs b/MediaBrowser.Controller/Session/SessionInfo.cs index 078d4d70f..64b20c13e 100644 --- a/MediaBrowser.Controller/Session/SessionInfo.cs +++ b/MediaBrowser.Controller/Session/SessionInfo.cs @@ -14,17 +14,8 @@ namespace MediaBrowser.Controller.Session public SessionInfo() { QueueableMediaTypes = new List<string>(); - PlayableMediaTypes = new List<string> - { - MediaType.Audio, - MediaType.Book, - MediaType.Game, - MediaType.Photo, - MediaType.Video - }; AdditionalUsers = new List<SessionUserInfo>(); - SupportedCommands = new List<string>(); PlayState = new PlayerStateInfo(); } @@ -32,6 +23,8 @@ namespace MediaBrowser.Controller.Session public List<SessionUserInfo> AdditionalUsers { get; set; } + public ClientCapabilities Capabilities { get; set; } + /// <summary> /// Gets or sets the remote end point. /// </summary> @@ -48,7 +41,17 @@ namespace MediaBrowser.Controller.Session /// Gets or sets the playable media types. /// </summary> /// <value>The playable media types.</value> - public List<string> PlayableMediaTypes { get; set; } + public List<string> PlayableMediaTypes + { + get + { + if (Capabilities == null) + { + return new List<string>(); + } + return Capabilities.PlayableMediaTypes; + } + } /// <summary> /// Gets or sets the id. @@ -126,7 +129,17 @@ namespace MediaBrowser.Controller.Session /// Gets or sets the supported commands. /// </summary> /// <value>The supported commands.</value> - public List<string> SupportedCommands { get; set; } + public List<string> SupportedCommands + { + get + { + if (Capabilities == null) + { + return new List<string>(); + } + return Capabilities.SupportedCommands; + } + } public TranscodingInfo TranscodingInfo { get; set; } @@ -151,6 +164,11 @@ namespace MediaBrowser.Controller.Session { get { + if (Capabilities == null || !Capabilities.SupportsMediaControl) + { + return false; + } + if (SessionController != null) { return SessionController.SupportsMediaControl; diff --git a/MediaBrowser.Controller/Sync/ICloudSyncProvider.cs b/MediaBrowser.Controller/Sync/ICloudSyncProvider.cs deleted file mode 100644 index f9327a71c..000000000 --- a/MediaBrowser.Controller/Sync/ICloudSyncProvider.cs +++ /dev/null @@ -1,21 +0,0 @@ -using MediaBrowser.Model.Sync; -using System.Collections.Generic; - -namespace MediaBrowser.Controller.Sync -{ - public interface ICloudSyncProvider - { - /// <summary> - /// Gets the name. - /// </summary> - /// <value>The name.</value> - string Name { get; } - - /// <summary> - /// Gets the synchronize targets. - /// </summary> - /// <param name="userId">The user identifier.</param> - /// <returns>IEnumerable<SyncTarget>.</returns> - IEnumerable<SyncTarget> GetSyncTargets(string userId); - } -} diff --git a/MediaBrowser.Controller/Sync/IServerSyncProvider.cs b/MediaBrowser.Controller/Sync/IServerSyncProvider.cs index 8ef54fd43..abf884e9d 100644 --- a/MediaBrowser.Controller/Sync/IServerSyncProvider.cs +++ b/MediaBrowser.Controller/Sync/IServerSyncProvider.cs @@ -1,5 +1,7 @@ using MediaBrowser.Model.Sync; +using System; using System.Collections.Generic; +using System.IO; using System.Threading; using System.Threading.Tasks; @@ -8,35 +10,58 @@ namespace MediaBrowser.Controller.Sync public interface IServerSyncProvider : ISyncProvider { /// <summary> - /// Gets the server item ids. + /// Transfers the file. /// </summary> - /// <param name="serverId">The server identifier.</param> + /// <param name="stream">The stream.</param> + /// <param name="remotePath">The remote path.</param> /// <param name="target">The target.</param> + /// <param name="progress">The progress.</param> /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task<List<System.String>>.</returns> - Task<List<string>> GetServerItemIds(string serverId, SyncTarget target, CancellationToken cancellationToken); + /// <returns>Task.</returns> + Task<SendFileResult> SendFile(Stream stream, string remotePath, SyncTarget target, IProgress<double> progress, CancellationToken cancellationToken); /// <summary> - /// Removes the item. + /// Deletes the file. /// </summary> - /// <param name="serverId">The server identifier.</param> - /// <param name="itemId">The item identifier.</param> + /// <param name="path">The path.</param> /// <param name="target">The target.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task.</returns> - Task DeleteItem(string serverId, string itemId, SyncTarget target, CancellationToken cancellationToken); + Task DeleteFile(string path, SyncTarget target, CancellationToken cancellationToken); /// <summary> - /// Transfers the file. + /// Gets the file. /// </summary> - /// <param name="serverId">The server identifier.</param> - /// <param name="itemId">The item identifier.</param> - /// <param name="pathParts">The path parts.</param> - /// <param name="name">The name.</param> - /// <param name="fileType">Type of the file.</param> + /// <param name="path">The path.</param> /// <param name="target">The target.</param> + /// <param name="progress">The progress.</param> /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task.</returns> - Task TransferItemFile(string serverId, string itemId, string[] pathParts, string name, ItemFileType fileType, SyncTarget target, CancellationToken cancellationToken); + /// <returns>Task<Stream>.</returns> + Task<Stream> GetFile(string path, SyncTarget target, IProgress<double> progress, CancellationToken cancellationToken); + + /// <summary> + /// Gets the full path. + /// </summary> + /// <param name="path">The path.</param> + /// <param name="target">The target.</param> + /// <returns>System.String.</returns> + string GetFullPath(IEnumerable<string> path, SyncTarget target); + + /// <summary> + /// Gets the parent directory path. + /// </summary> + /// <param name="path">The path.</param> + /// <param name="target">The target.</param> + /// <returns>System.String.</returns> + string GetParentDirectoryPath(string path, SyncTarget target); + + /// <summary> + /// Gets the file system entries. + /// </summary> + /// <param name="path">The path.</param> + /// <param name="target">The target.</param> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns>Task<List<DeviceFileInfo>>.</returns> + Task<List<DeviceFileInfo>> GetFileSystemEntries(string path, SyncTarget target, CancellationToken cancellationToken); } } diff --git a/MediaBrowser.Controller/Sync/ISyncDataProvider.cs b/MediaBrowser.Controller/Sync/ISyncDataProvider.cs new file mode 100644 index 000000000..f84748b97 --- /dev/null +++ b/MediaBrowser.Controller/Sync/ISyncDataProvider.cs @@ -0,0 +1,50 @@ +using MediaBrowser.Model.Sync; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace MediaBrowser.Controller.Sync +{ + public interface ISyncDataProvider + { + /// <summary> + /// Gets the server item ids. + /// </summary> + /// <param name="target">The target.</param> + /// <param name="serverId">The server identifier.</param> + /// <returns>Task<List<System.String>>.</returns> + Task<List<string>> GetServerItemIds(SyncTarget target, string serverId); + + /// <summary> + /// Adds the or update. + /// </summary> + /// <param name="target">The target.</param> + /// <param name="item">The item.</param> + /// <returns>Task.</returns> + Task AddOrUpdate(SyncTarget target, LocalItem item); + + /// <summary> + /// Deletes the specified identifier. + /// </summary> + /// <param name="target">The target.</param> + /// <param name="id">The identifier.</param> + /// <returns>Task.</returns> + Task Delete(SyncTarget target, string id); + + /// <summary> + /// Gets the specified identifier. + /// </summary> + /// <param name="target">The target.</param> + /// <param name="id">The identifier.</param> + /// <returns>Task<LocalItem>.</returns> + Task<LocalItem> Get(SyncTarget target, string id); + + /// <summary> + /// Gets the cached item. + /// </summary> + /// <param name="target">The target.</param> + /// <param name="serverId">The server identifier.</param> + /// <param name="itemId">The item identifier.</param> + /// <returns>Task<LocalItem>.</returns> + Task<List<LocalItem>> GetCachedItems(SyncTarget target, string serverId, string itemId); + } +} diff --git a/MediaBrowser.Controller/Sync/ISyncManager.cs b/MediaBrowser.Controller/Sync/ISyncManager.cs index 4b800cac9..c51c8c1ba 100644 --- a/MediaBrowser.Controller/Sync/ISyncManager.cs +++ b/MediaBrowser.Controller/Sync/ISyncManager.cs @@ -91,13 +91,6 @@ namespace MediaBrowser.Controller.Sync bool SupportsSync(BaseItem item); /// <summary> - /// Gets the device profile. - /// </summary> - /// <param name="targetId">The target identifier.</param> - /// <returns>DeviceProfile.</returns> - DeviceProfile GetDeviceProfile(string targetId); - - /// <summary> /// Reports the synchronize job item transferred. /// </summary> /// <param name="id">The identifier.</param> @@ -154,21 +147,6 @@ namespace MediaBrowser.Controller.Sync QueryResult<string> GetLibraryItemIds(SyncJobItemQuery query); /// <summary> - /// Gets the audio options. - /// </summary> - /// <param name="jobItem">The job item.</param> - /// <returns>AudioOptions.</returns> - AudioOptions GetAudioOptions(SyncJobItem jobItem); - - /// <summary> - /// Gets the video options. - /// </summary> - /// <param name="jobItem">The job item.</param> - /// <param name="job">The job.</param> - /// <returns>VideoOptions.</returns> - VideoOptions GetVideoOptions(SyncJobItem jobItem, SyncJob job); - - /// <summary> /// Reports the synchronize job item transfer beginning. /// </summary> /// <param name="id">The identifier.</param> @@ -181,5 +159,19 @@ namespace MediaBrowser.Controller.Sync /// <param name="id">The identifier.</param> /// <returns>Task.</returns> Task ReportSyncJobItemTransferFailed(string id); + + /// <summary> + /// Gets the quality options. + /// </summary> + /// <param name="targetId">The target identifier.</param> + /// <returns>IEnumerable<SyncQualityOption>.</returns> + IEnumerable<SyncQualityOption> GetQualityOptions(string targetId); + + /// <summary> + /// Gets the profile options. + /// </summary> + /// <param name="targetId">The target identifier.</param> + /// <returns>IEnumerable<SyncQualityOption>.</returns> + IEnumerable<SyncProfileOption> GetProfileOptions(string targetId); } } diff --git a/MediaBrowser.Controller/Sync/ISyncProvider.cs b/MediaBrowser.Controller/Sync/ISyncProvider.cs index 6f24eac1a..ef34bfe69 100644 --- a/MediaBrowser.Controller/Sync/ISyncProvider.cs +++ b/MediaBrowser.Controller/Sync/ISyncProvider.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Model.Dlna; -using MediaBrowser.Model.Sync; +using MediaBrowser.Model.Sync; using System.Collections.Generic; namespace MediaBrowser.Controller.Sync @@ -18,13 +17,12 @@ namespace MediaBrowser.Controller.Sync /// <param name="userId">The user identifier.</param> /// <returns>IEnumerable<SyncTarget>.</returns> IEnumerable<SyncTarget> GetSyncTargets(string userId); - + /// <summary> - /// Gets the device profile. + /// Gets all synchronize targets. /// </summary> - /// <param name="target">The target.</param> - /// <returns>DeviceProfile.</returns> - DeviceProfile GetDeviceProfile(SyncTarget target); + /// <returns>IEnumerable<SyncTarget>.</returns> + IEnumerable<SyncTarget> GetAllSyncTargets(); } public interface IHasUniqueTargetIds diff --git a/MediaBrowser.Controller/Sync/SendFileResult.cs b/MediaBrowser.Controller/Sync/SendFileResult.cs new file mode 100644 index 000000000..62753444a --- /dev/null +++ b/MediaBrowser.Controller/Sync/SendFileResult.cs @@ -0,0 +1,18 @@ +using MediaBrowser.Model.MediaInfo; + +namespace MediaBrowser.Controller.Sync +{ + public class SendFileResult + { + /// <summary> + /// Gets or sets the path. + /// </summary> + /// <value>The path.</value> + public string Path { get; set; } + /// <summary> + /// Gets or sets the protocol. + /// </summary> + /// <value>The protocol.</value> + public MediaProtocol Protocol { get; set; } + } +} |
