aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MediaBrowser.Api/ItemRefreshService.cs2
-rw-r--r--MediaBrowser.Api/ItemUpdateService.cs23
-rw-r--r--MediaBrowser.Api/Music/AlbumsService.cs10
-rw-r--r--MediaBrowser.Api/Playback/TranscodingThrottler.cs11
-rw-r--r--MediaBrowser.Api/SearchService.cs2
-rw-r--r--MediaBrowser.Api/StartupWizardService.cs1
-rw-r--r--MediaBrowser.Api/Subtitles/SubtitleService.cs6
-rw-r--r--MediaBrowser.Api/UserLibrary/ItemsService.cs77
-rw-r--r--MediaBrowser.Controller/Entities/Audio/Audio.cs10
-rw-r--r--MediaBrowser.Controller/Entities/Audio/IHasAlbumArtist.cs20
-rw-r--r--MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs10
-rw-r--r--MediaBrowser.Controller/Entities/Audio/MusicArtist.cs2
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs3
-rw-r--r--MediaBrowser.Controller/Entities/InternalItemsQuery.cs4
-rw-r--r--MediaBrowser.Controller/Entities/MusicVideo.cs10
-rw-r--r--MediaBrowser.Controller/Entities/UserView.cs6
-rw-r--r--MediaBrowser.Controller/Entities/UserViewBuilder.cs45
-rw-r--r--MediaBrowser.Controller/Library/ILibraryManager.cs8
-rw-r--r--MediaBrowser.Controller/Library/IUserViewManager.cs6
-rw-r--r--MediaBrowser.Controller/MediaBrowser.Controller.csproj46
-rw-r--r--MediaBrowser.Controller/Playlists/Playlist.cs2
-rw-r--r--MediaBrowser.Controller/Providers/AlbumInfo.cs28
-rw-r--r--MediaBrowser.Controller/Providers/ArtistInfo.cs14
-rw-r--r--MediaBrowser.Controller/Providers/BookInfo.cs7
-rw-r--r--MediaBrowser.Controller/Providers/BoxSetInfo.cs7
-rw-r--r--MediaBrowser.Controller/Providers/ChannelItemLookupInfo.cs11
-rw-r--r--MediaBrowser.Controller/Providers/DirectoryService.cs10
-rw-r--r--MediaBrowser.Controller/Providers/DynamicImageInfo.cs10
-rw-r--r--MediaBrowser.Controller/Providers/DynamicImageResponse.cs35
-rw-r--r--MediaBrowser.Controller/Providers/EpisodeIdentity.cs12
-rw-r--r--MediaBrowser.Controller/Providers/EpisodeInfo.cs34
-rw-r--r--MediaBrowser.Controller/Providers/ExtraInfo.cs15
-rw-r--r--MediaBrowser.Controller/Providers/ExtraSource.cs9
-rw-r--r--MediaBrowser.Controller/Providers/GameInfo.cs11
-rw-r--r--MediaBrowser.Controller/Providers/GameSystemInfo.cs11
-rw-r--r--MediaBrowser.Controller/Providers/ICustomMetadataProvider.cs5
-rw-r--r--MediaBrowser.Controller/Providers/IDirectoryService.cs15
-rw-r--r--MediaBrowser.Controller/Providers/IDynamicImageProvider.cs27
-rw-r--r--MediaBrowser.Controller/Providers/IExtrasProvider.cs19
-rw-r--r--MediaBrowser.Controller/Providers/IHasChangeMonitor.cs12
-rw-r--r--MediaBrowser.Controller/Providers/IHasIdentities.cs14
-rw-r--r--MediaBrowser.Controller/Providers/IHasItemChangeMonitor.cs16
-rw-r--r--MediaBrowser.Controller/Providers/IHasLookupInfo.cs8
-rw-r--r--MediaBrowser.Controller/Providers/IHasOrder.cs7
-rw-r--r--MediaBrowser.Controller/Providers/IImageFileSaver.cs20
-rw-r--r--MediaBrowser.Controller/Providers/IImageSaver.cs20
-rw-r--r--MediaBrowser.Controller/Providers/IItemIdentity.cs7
-rw-r--r--MediaBrowser.Controller/Providers/IItemIdentityConverter.cs4
-rw-r--r--MediaBrowser.Controller/Providers/IItemIdentityProvider.cs4
-rw-r--r--MediaBrowser.Controller/Providers/ILocalImageFileProvider.cs10
-rw-r--r--MediaBrowser.Controller/Providers/ILocalImageProvider.cs75
-rw-r--r--MediaBrowser.Controller/Providers/ILocalMetadataProvider.cs27
-rw-r--r--MediaBrowser.Controller/Providers/IMetadataProvider.cs11
-rw-r--r--MediaBrowser.Controller/Providers/IPreRefreshProvider.cs7
-rw-r--r--MediaBrowser.Controller/Providers/IProviderManager.cs8
-rw-r--r--MediaBrowser.Controller/Providers/IRemoteMetadataProvider.cs31
-rw-r--r--MediaBrowser.Controller/Providers/IRemoteSearchProvider.cs17
-rw-r--r--MediaBrowser.Controller/Providers/ISeriesOrderManager.cs11
-rw-r--r--MediaBrowser.Controller/Providers/ISeriesOrderProvider.cs10
-rw-r--r--MediaBrowser.Controller/Providers/ImageRefreshMode.cs25
-rw-r--r--MediaBrowser.Controller/Providers/ImageRefreshOptions.cs29
-rw-r--r--MediaBrowser.Controller/Providers/ItemIdentities.cs21
-rw-r--r--MediaBrowser.Controller/Providers/ItemInfo.cs9
-rw-r--r--MediaBrowser.Controller/Providers/ItemLookupInfo.cs206
-rw-r--r--MediaBrowser.Controller/Providers/LocalImageInfo.cs11
-rw-r--r--MediaBrowser.Controller/Providers/LocalMetadataResult.cs24
-rw-r--r--MediaBrowser.Controller/Providers/MetadataRefreshMode.cs25
-rw-r--r--MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs74
-rw-r--r--MediaBrowser.Controller/Providers/MetadataResult.cs8
-rw-r--r--MediaBrowser.Controller/Providers/MovieInfo.cs7
-rw-r--r--MediaBrowser.Controller/Providers/MusicVideoInfo.cs7
-rw-r--r--MediaBrowser.Controller/Providers/PersonLookupInfo.cs7
-rw-r--r--MediaBrowser.Controller/Providers/RemoteSearchQuery.cs19
-rw-r--r--MediaBrowser.Controller/Providers/SeasonIdentity.cs11
-rw-r--r--MediaBrowser.Controller/Providers/SeasonInfo.cs32
-rw-r--r--MediaBrowser.Controller/Providers/SeriesIdentity.cs9
-rw-r--r--MediaBrowser.Controller/Providers/SeriesInfo.cs25
-rw-r--r--MediaBrowser.Controller/Providers/SeriesOrderTypes.cs7
-rw-r--r--MediaBrowser.Controller/Providers/SongInfo.cs17
-rw-r--r--MediaBrowser.Controller/Providers/TrailerInfo.cs7
-rw-r--r--MediaBrowser.Controller/Sync/IServerSyncProvider.cs2
-rw-r--r--MediaBrowser.Controller/Sync/SendFileResult.cs18
-rw-r--r--MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj6
-rw-r--r--MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj6
-rw-r--r--MediaBrowser.Model/ApiClient/IApiClient.cs52
-rw-r--r--MediaBrowser.Model/Configuration/ServerConfiguration.cs6
-rw-r--r--MediaBrowser.Model/Dto/BaseItemDto.cs12
-rw-r--r--MediaBrowser.Model/Dto/NameIdPair.cs17
-rw-r--r--MediaBrowser.Model/LiveTv/RecordingInfoDto.cs4
-rw-r--r--MediaBrowser.Model/MediaBrowser.Model.csproj2
-rw-r--r--MediaBrowser.Model/Querying/ItemQuery.cs24
-rw-r--r--MediaBrowser.Model/Querying/SimilarItemsByNameQuery.cs29
-rw-r--r--MediaBrowser.Providers/FolderImages/DefaultImageProvider.cs71
-rw-r--r--MediaBrowser.Providers/Manager/ItemImageProvider.cs6
-rw-r--r--MediaBrowser.Providers/Manager/ProviderManager.cs82
-rw-r--r--MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Channels/ChannelManager.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Collections/CollectionImageProvider.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Dto/DtoService.cs61
-rw-r--r--MediaBrowser.Server.Implementations/Library/LibraryManager.cs65
-rw-r--r--MediaBrowser.Server.Implementations/Library/MusicManager.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Library/UserViewManager.cs27
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs3
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/server.json2
-rw-r--r--MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj2
-rw-r--r--MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs113
-rw-r--r--MediaBrowser.Server.Implementations/Photos/DynamicImageHelpers.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Photos/DynamicImageProvider.cs87
-rw-r--r--MediaBrowser.Server.Implementations/Photos/PhotoAlbumImageProvider.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Photos/StripCollageBuilder.cs179
-rw-r--r--MediaBrowser.Server.Implementations/Playlists/PlaylistImageProvider.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Sync/MediaSync.cs17
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs4
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncManager.cs8
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncRepository.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncedMediaSourceProvider.cs23
-rw-r--r--MediaBrowser.Server.Startup.Common/ApplicationHost.cs10
-rw-r--r--Nuget/MediaBrowser.Common.Internal.nuspec4
-rw-r--r--Nuget/MediaBrowser.Common.nuspec2
-rw-r--r--Nuget/MediaBrowser.Model.Signed.nuspec2
-rw-r--r--Nuget/MediaBrowser.Server.Core.nuspec4
121 files changed, 1523 insertions, 928 deletions
diff --git a/MediaBrowser.Api/ItemRefreshService.cs b/MediaBrowser.Api/ItemRefreshService.cs
index 78bc14ab0..6a7b4826c 100644
--- a/MediaBrowser.Api/ItemRefreshService.cs
+++ b/MediaBrowser.Api/ItemRefreshService.cs
@@ -53,7 +53,7 @@ namespace MediaBrowser.Api
var albums = _libraryManager.RootFolder
.GetRecursiveChildren()
.OfType<MusicAlbum>()
- .Where(i => i.HasArtist(item.Name))
+ .Where(i => i.HasAnyArtist(item.Name))
.ToList();
var musicArtists = albums
diff --git a/MediaBrowser.Api/ItemUpdateService.cs b/MediaBrowser.Api/ItemUpdateService.cs
index 6517d738b..86689f5cf 100644
--- a/MediaBrowser.Api/ItemUpdateService.cs
+++ b/MediaBrowser.Api/ItemUpdateService.cs
@@ -389,20 +389,33 @@ namespace MediaBrowser.Api
game.PlayersSupported = request.Players;
}
- var song = item as Audio;
+ var hasAlbumArtists = item as IHasAlbumArtist;
+ if (hasAlbumArtists != null)
+ {
+ hasAlbumArtists.AlbumArtists = request
+ .AlbumArtists
+ .Select(i => i.Name)
+ .ToList();
+ }
+ var hasArtists = item as IHasArtist;
+ if (hasArtists != null)
+ {
+ hasArtists.Artists = request
+ .ArtistItems
+ .Select(i => i.Name)
+ .ToList();
+ }
+
+ var song = item as Audio;
if (song != null)
{
song.Album = request.Album;
- song.AlbumArtists = string.IsNullOrWhiteSpace(request.AlbumArtist) ? new List<string>() : new List<string> { request.AlbumArtist };
- song.Artists = request.Artists.ToList();
}
var musicVideo = item as MusicVideo;
-
if (musicVideo != null)
{
- musicVideo.Artists = request.Artists.ToList();
musicVideo.Album = request.Album;
}
diff --git a/MediaBrowser.Api/Music/AlbumsService.cs b/MediaBrowser.Api/Music/AlbumsService.cs
index 76c6c5776..a1c98addb 100644
--- a/MediaBrowser.Api/Music/AlbumsService.cs
+++ b/MediaBrowser.Api/Music/AlbumsService.cs
@@ -77,15 +77,13 @@ namespace MediaBrowser.Api.Music
var album1 = (MusicAlbum)item1;
var album2 = (MusicAlbum)item2;
- var artists1 = album1.GetRecursiveChildren(i => i is IHasArtist)
- .Cast<IHasArtist>()
- .SelectMany(i => i.AllArtists)
+ var artists1 = album1
+ .AllArtists
.Distinct(StringComparer.OrdinalIgnoreCase)
.ToList();
- var artists2 = album2.GetRecursiveChildren(i => i is IHasArtist)
- .Cast<IHasArtist>()
- .SelectMany(i => i.AllArtists)
+ var artists2 = album2
+ .AllArtists
.Distinct(StringComparer.OrdinalIgnoreCase)
.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase);
diff --git a/MediaBrowser.Api/Playback/TranscodingThrottler.cs b/MediaBrowser.Api/Playback/TranscodingThrottler.cs
index f22ef4326..c486a44ea 100644
--- a/MediaBrowser.Api/Playback/TranscodingThrottler.cs
+++ b/MediaBrowser.Api/Playback/TranscodingThrottler.cs
@@ -25,10 +25,7 @@ namespace MediaBrowser.Api.Playback
public void Start()
{
- if (_processManager.SupportsSuspension)
- {
- //_timer = new Timer(TimerCallback, null, 5000, 5000);
- }
+ _timer = new Timer(TimerCallback, null, 5000, 5000);
}
private void TimerCallback(object state)
@@ -58,8 +55,7 @@ namespace MediaBrowser.Api.Playback
try
{
- //_job.Process.StandardInput.WriteLine("p");
- _processManager.SuspendProcess(_job.Process);
+ _job.Process.StandardInput.WriteLine("p");
_isPaused = true;
}
catch (Exception ex)
@@ -77,8 +73,7 @@ namespace MediaBrowser.Api.Playback
try
{
- //_job.Process.StandardInput.WriteLine("u");
- _processManager.ResumeProcess(_job.Process);
+ _job.Process.StandardInput.WriteLine("u");
_isPaused = false;
}
catch (Exception ex)
diff --git a/MediaBrowser.Api/SearchService.cs b/MediaBrowser.Api/SearchService.cs
index ee48946d5..2cca72593 100644
--- a/MediaBrowser.Api/SearchService.cs
+++ b/MediaBrowser.Api/SearchService.cs
@@ -211,7 +211,7 @@ namespace MediaBrowser.Api
result.SongCount = album.Tracks.Count();
result.Artists = album.Artists.ToArray();
- result.AlbumArtist = album.AlbumArtists.FirstOrDefault();
+ result.AlbumArtist = album.AlbumArtist;
}
var song = item as Audio;
diff --git a/MediaBrowser.Api/StartupWizardService.cs b/MediaBrowser.Api/StartupWizardService.cs
index bf5c04540..4655f2c6f 100644
--- a/MediaBrowser.Api/StartupWizardService.cs
+++ b/MediaBrowser.Api/StartupWizardService.cs
@@ -65,6 +65,7 @@ namespace MediaBrowser.Api
_config.Configuration.MergeMetadataAndImagesByName = true;
_config.Configuration.EnableStandaloneMetadata = true;
_config.Configuration.EnableLibraryMetadataSubFolder = true;
+ _config.Configuration.EnableUserSpecificUserViews = true;
_config.SaveConfiguration();
}
diff --git a/MediaBrowser.Api/Subtitles/SubtitleService.cs b/MediaBrowser.Api/Subtitles/SubtitleService.cs
index c7997be5b..07eb74e81 100644
--- a/MediaBrowser.Api/Subtitles/SubtitleService.cs
+++ b/MediaBrowser.Api/Subtitles/SubtitleService.cs
@@ -125,13 +125,15 @@ namespace MediaBrowser.Api.Subtitles
private readonly ISubtitleManager _subtitleManager;
private readonly ISubtitleEncoder _subtitleEncoder;
private readonly IMediaSourceManager _mediaSourceManager;
+ private readonly IProviderManager _providerManager;
- public SubtitleService(ILibraryManager libraryManager, ISubtitleManager subtitleManager, ISubtitleEncoder subtitleEncoder, IMediaSourceManager mediaSourceManager)
+ public SubtitleService(ILibraryManager libraryManager, ISubtitleManager subtitleManager, ISubtitleEncoder subtitleEncoder, IMediaSourceManager mediaSourceManager, IProviderManager providerManager)
{
_libraryManager = libraryManager;
_subtitleManager = subtitleManager;
_subtitleEncoder = subtitleEncoder;
_mediaSourceManager = mediaSourceManager;
+ _providerManager = providerManager;
}
public object Get(GetSubtitlePlaylist request)
@@ -256,7 +258,7 @@ namespace MediaBrowser.Api.Subtitles
await _subtitleManager.DownloadSubtitles(video, request.SubtitleId, CancellationToken.None)
.ConfigureAwait(false);
- await video.RefreshMetadata(new MetadataRefreshOptions(new DirectoryService()), CancellationToken.None).ConfigureAwait(false);
+ _providerManager.QueueRefresh(video.Id, new MetadataRefreshOptions());
}
catch (Exception ex)
{
diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs
index 9b5ef3a98..bdaad49e6 100644
--- a/MediaBrowser.Api/UserLibrary/ItemsService.cs
+++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs
@@ -46,9 +46,6 @@ namespace MediaBrowser.Api.UserLibrary
[ApiMember(Name = "PersonTypes", Description = "Optional. If specified, along with Person, results will be filtered to include only those containing the specified person and PersonType. Allows multiple, comma-delimited", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public string PersonTypes { get; set; }
- [ApiMember(Name = "AllGenres", Description = "Optional. If specified, results will be filtered based on genre. This allows multiple, pipe delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
- public string AllGenres { get; set; }
-
/// <summary>
/// Limit results to items containing specific studios
/// </summary>
@@ -56,6 +53,9 @@ namespace MediaBrowser.Api.UserLibrary
[ApiMember(Name = "Studios", Description = "Optional. If specified, results will be filtered based on studio. This allows multiple, pipe delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
public string Studios { get; set; }
+ [ApiMember(Name = "StudioIds", Description = "Optional. If specified, results will be filtered based on studio. This allows multiple, pipe delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
+ public string StudioIds { get; set; }
+
/// <summary>
/// Gets or sets the studios.
/// </summary>
@@ -63,6 +63,9 @@ namespace MediaBrowser.Api.UserLibrary
[ApiMember(Name = "Artists", Description = "Optional. If specified, results will be filtered based on artist. This allows multiple, pipe delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
public string Artists { get; set; }
+ [ApiMember(Name = "ArtistIds", Description = "Optional. If specified, results will be filtered based on artist. This allows multiple, pipe delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
+ public string ArtistIds { get; set; }
+
[ApiMember(Name = "Albums", Description = "Optional. If specified, results will be filtered based on album. This allows multiple, pipe delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
public string Albums { get; set; }
@@ -226,14 +229,14 @@ namespace MediaBrowser.Api.UserLibrary
[ApiMember(Name = "CollapseBoxSetItems", Description = "Whether or not to hide items behind their boxsets.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
public bool? CollapseBoxSetItems { get; set; }
- public string[] GetAllGenres()
+ public string[] GetStudios()
{
- return (AllGenres ?? string.Empty).Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
+ return (Studios ?? string.Empty).Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
}
- public string[] GetStudios()
+ public string[] GetStudioIds()
{
- return (Studios ?? string.Empty).Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
+ return (StudioIds ?? string.Empty).Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
}
public string[] GetPersonTypes()
@@ -241,7 +244,7 @@ namespace MediaBrowser.Api.UserLibrary
return (PersonTypes ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
}
- public IEnumerable<VideoType> GetVideoTypes()
+ public VideoType[] GetVideoTypes()
{
var val = VideoTypes;
@@ -250,7 +253,7 @@ namespace MediaBrowser.Api.UserLibrary
return new VideoType[] { };
}
- return val.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(v => (VideoType)Enum.Parse(typeof(VideoType), v, true));
+ return val.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(v => (VideoType)Enum.Parse(typeof(VideoType), v, true)).ToArray();
}
}
@@ -471,8 +474,8 @@ namespace MediaBrowser.Api.UserLibrary
Tags = request.GetTags(),
OfficialRatings = request.GetOfficialRatings(),
Genres = request.GetGenres(),
- AllGenres = request.GetAllGenres(),
Studios = request.GetStudios(),
+ StudioIds = request.GetStudioIds(),
Person = request.Person,
PersonTypes = request.GetPersonTypes(),
Years = request.GetYears(),
@@ -609,6 +612,8 @@ namespace MediaBrowser.Api.UserLibrary
private bool ApplyAdditionalFilters(GetItems request, BaseItem i, User user, bool isPreFiltered, ILibraryManager libraryManager)
{
+ var video = i as Video;
+
if (!isPreFiltered)
{
var mediaTypes = request.GetMediaTypes();
@@ -656,7 +661,6 @@ namespace MediaBrowser.Api.UserLibrary
if (request.Is3D.HasValue)
{
var val = request.Is3D.Value;
- var video = i as Video;
if (video == null || val != video.Video3DFormat.HasValue)
{
@@ -667,7 +671,6 @@ namespace MediaBrowser.Api.UserLibrary
if (request.IsHD.HasValue)
{
var val = request.IsHD.Value;
- var video = i as Video;
if (video == null || val != video.IsHD)
{
@@ -809,8 +812,6 @@ namespace MediaBrowser.Api.UserLibrary
{
var val = request.HasSubtitles.Value;
- var video = i as Video;
-
if (video == null || val != video.HasSubtitles)
{
return false;
@@ -930,23 +931,11 @@ namespace MediaBrowser.Api.UserLibrary
return false;
}
- // Apply genre filter
- var allGenres = request.GetAllGenres();
- if (allGenres.Length > 0 && !allGenres.All(v => i.Genres.Contains(v, StringComparer.OrdinalIgnoreCase)))
- {
- return false;
- }
-
// Filter by VideoType
- if (!string.IsNullOrEmpty(request.VideoTypes))
+ var videoTypes = request.GetVideoTypes();
+ if (videoTypes.Length > 0 && (video == null || !videoTypes.Contains(video.VideoType)))
{
- var types = request.VideoTypes.Split(',');
-
- var video = i as Video;
- if (video == null || !types.Contains(video.VideoType.ToString(), StringComparer.OrdinalIgnoreCase))
- {
- return false;
- }
+ return false;
}
var imageTypes = request.GetImageTypes().ToList();
@@ -965,6 +954,17 @@ namespace MediaBrowser.Api.UserLibrary
return false;
}
+ // Apply studio filter
+ var studioIds = request.GetStudioIds();
+ if (studioIds.Length > 0 && !studioIds.Any(id =>
+ {
+ var studioItem = libraryManager.GetItemById(id);
+ return studioItem != null && i.Studios.Contains(studioItem.Name, StringComparer.OrdinalIgnoreCase);
+ }))
+ {
+ return false;
+ }
+
// Apply year filter
var years = request.GetYears();
if (years.Length > 0 && !(i.ProductionYear.HasValue && years.Contains(i.ProductionYear.Value)))
@@ -1031,13 +1031,30 @@ namespace MediaBrowser.Api.UserLibrary
}
// Artists
+ if (!string.IsNullOrEmpty(request.ArtistIds))
+ {
+ var artistIds = request.ArtistIds.Split('|');
+
+ var audio = i as IHasArtist;
+
+ if (!(audio != null && artistIds.Any(id =>
+ {
+ var artistItem = libraryManager.GetItemById(id);
+ return artistItem != null && audio.HasAnyArtist(artistItem.Name);
+ })))
+ {
+ return false;
+ }
+ }
+
+ // Artists
if (!string.IsNullOrEmpty(request.Artists))
{
var artists = request.Artists.Split('|');
var audio = i as IHasArtist;
- if (!(audio != null && artists.Any(audio.HasArtist)))
+ if (!(audio != null && artists.Any(audio.HasAnyArtist)))
{
return false;
}
diff --git a/MediaBrowser.Controller/Entities/Audio/Audio.cs b/MediaBrowser.Controller/Entities/Audio/Audio.cs
index d868227d9..c033b144a 100644
--- a/MediaBrowser.Controller/Entities/Audio/Audio.cs
+++ b/MediaBrowser.Controller/Entities/Audio/Audio.cs
@@ -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>
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 fed9689b3..4185590ab 100644
--- a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
+++ b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
@@ -213,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 df28c282d..b1fa12884 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -1455,7 +1455,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/InternalItemsQuery.cs b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
index e99c11e87..e1344009f 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; }
@@ -66,6 +65,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,9 +80,9 @@ 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[] { };
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/UserView.cs b/MediaBrowser.Controller/Entities/UserView.cs
index d0378821f..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,6 +16,7 @@ namespace MediaBrowser.Controller.Entities
public Guid? UserId { get; set; }
public static ITVSeriesManager TVSeriesManager;
+ public static IPlaylistManager PlaylistManager;
public bool ContainsDynamicCategories(User user)
{
@@ -30,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);
}
diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
index 35ada4aef..12eae9a75 100644
--- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs
+++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
@@ -5,6 +5,7 @@ using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.LiveTv;
+using MediaBrowser.Controller.Playlists;
using MediaBrowser.Controller.TV;
using MediaBrowser.Model.Channels;
using MediaBrowser.Model.Entities;
@@ -30,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;
@@ -41,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)
@@ -115,6 +118,9 @@ namespace MediaBrowser.Controller.Entities
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);
@@ -572,6 +578,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 =>
@@ -935,11 +946,6 @@ namespace MediaBrowser.Controller.Entities
return false;
}
- if (request.AllGenres.Length > 0)
- {
- return false;
- }
-
if (request.Genres.Length > 0)
{
return false;
@@ -1050,6 +1056,11 @@ namespace MediaBrowser.Controller.Entities
return false;
}
+ if (request.StudioIds.Length > 0)
+ {
+ return false;
+ }
+
if (request.VideoTypes.Length > 0)
{
return false;
@@ -1569,12 +1580,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)
{
@@ -1596,6 +1601,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)
{
@@ -1714,7 +1729,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));
@@ -1723,7 +1738,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;
@@ -1731,7 +1746,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/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&lt;UserView&gt;.</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&lt;UserView&gt;.</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/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/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
index f046c76fc..678d7841c 100644
--- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj
+++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
@@ -247,22 +247,67 @@
<Compile Include="Persistence\MediaStreamQuery.cs" />
<Compile Include="Playlists\IPlaylistManager.cs" />
<Compile Include="Playlists\Playlist.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\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" />
@@ -350,6 +395,7 @@
<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/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/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/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/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/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 38ac958b3..e510a8995 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,6 +18,13 @@ 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 metadata.
/// </summary>
/// <param name="item">The item.</param>
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 649096a75..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/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 078f1e77a..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
{
@@ -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/Sync/IServerSyncProvider.cs b/MediaBrowser.Controller/Sync/IServerSyncProvider.cs
index 98ea2ce06..422349b80 100644
--- a/MediaBrowser.Controller/Sync/IServerSyncProvider.cs
+++ b/MediaBrowser.Controller/Sync/IServerSyncProvider.cs
@@ -18,7 +18,7 @@ namespace MediaBrowser.Controller.Sync
/// <param name="progress">The progress.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task.</returns>
- Task SendFile(Stream stream, string remotePath, SyncTarget target, IProgress<double> progress, CancellationToken cancellationToken);
+ Task<SendFileResult> SendFile(Stream stream, string remotePath, SyncTarget target, IProgress<double> progress, CancellationToken cancellationToken);
/// <summary>
/// Deletes the file.
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; }
+ }
+}
diff --git a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
index 2e61ed89c..74f927c7e 100644
--- a/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
+++ b/MediaBrowser.Model.Portable/MediaBrowser.Model.Portable.csproj
@@ -491,6 +491,9 @@
<Compile Include="..\MediaBrowser.Model\Dto\MetadataEditorInfo.cs">
<Link>Dto\MetadataEditorInfo.cs</Link>
</Compile>
+ <Compile Include="..\MediaBrowser.Model\Dto\NameIdPair.cs">
+ <Link>Dto\NameIdPair.cs</Link>
+ </Compile>
<Compile Include="..\MediaBrowser.Model\Dto\NameValuePair.cs">
<Link>Dto\NameValuePair.cs</Link>
</Compile>
@@ -977,9 +980,6 @@
<Compile Include="..\MediaBrowser.Model\Querying\SessionQuery.cs">
<Link>Querying\SessionQuery.cs</Link>
</Compile>
- <Compile Include="..\MediaBrowser.Model\Querying\SimilarItemsByNameQuery.cs">
- <Link>Querying\SimilarItemsByNameQuery.cs</Link>
- </Compile>
<Compile Include="..\MediaBrowser.Model\Querying\SimilarItemsQuery.cs">
<Link>Querying\SimilarItemsQuery.cs</Link>
</Compile>
diff --git a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
index ba4ac22e7..7f6f7bc13 100644
--- a/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
+++ b/MediaBrowser.Model.net35/MediaBrowser.Model.net35.csproj
@@ -459,6 +459,9 @@
<Compile Include="..\MediaBrowser.Model\Dto\MetadataEditorInfo.cs">
<Link>Dto\MetadataEditorInfo.cs</Link>
</Compile>
+ <Compile Include="..\MediaBrowser.Model\Dto\NameIdPair.cs">
+ <Link>Dto\NameIdPair.cs</Link>
+ </Compile>
<Compile Include="..\MediaBrowser.Model\Dto\NameValuePair.cs">
<Link>Dto\NameValuePair.cs</Link>
</Compile>
@@ -939,9 +942,6 @@
<Compile Include="..\MediaBrowser.Model\Querying\SessionQuery.cs">
<Link>Querying\SessionQuery.cs</Link>
</Compile>
- <Compile Include="..\MediaBrowser.Model\Querying\SimilarItemsByNameQuery.cs">
- <Link>Querying\SimilarItemsByNameQuery.cs</Link>
- </Compile>
<Compile Include="..\MediaBrowser.Model\Querying\SimilarItemsQuery.cs">
<Link>Querying\SimilarItemsQuery.cs</Link>
</Compile>
diff --git a/MediaBrowser.Model/ApiClient/IApiClient.cs b/MediaBrowser.Model/ApiClient/IApiClient.cs
index 190f2100e..7e07b3f3b 100644
--- a/MediaBrowser.Model/ApiClient/IApiClient.cs
+++ b/MediaBrowser.Model/ApiClient/IApiClient.cs
@@ -251,12 +251,12 @@ namespace MediaBrowser.Model.ApiClient
Task<ItemsResult> GetAdditionalParts(string itemId, string userId);
/// <summary>
- /// Gets the live media information.
+ /// Gets the playback information.
/// </summary>
/// <param name="itemId">The item identifier.</param>
/// <param name="userId">The user identifier.</param>
/// <returns>Task&lt;LiveMediaInfoResult&gt;.</returns>
- Task<LiveMediaInfoResult> GetLiveMediaInfo(string itemId, string userId);
+ Task<LiveMediaInfoResult> GetPlaybackInfo(string itemId, string userId);
/// <summary>
/// Gets the users async.
@@ -344,14 +344,14 @@ namespace MediaBrowser.Model.ApiClient
/// </summary>
/// <param name="query">The query.</param>
/// <returns>Task{ItemsResult}.</returns>
- Task<ItemsResult> GetInstantMixFromArtistAsync(SimilarItemsByNameQuery query);
+ Task<ItemsResult> GetInstantMixFromArtistAsync(SimilarItemsQuery query);
/// <summary>
/// Gets the instant mix from music genre async.
/// </summary>
/// <param name="query">The query.</param>
/// <returns>Task{ItemsResult}.</returns>
- Task<ItemsResult> GetInstantMixFromMusicGenreAsync(SimilarItemsByNameQuery query);
+ Task<ItemsResult> GetInstantMixFromMusicGenreAsync(SimilarItemsQuery query);
/// <summary>
/// Gets the similar movies async.
@@ -418,15 +418,6 @@ namespace MediaBrowser.Model.ApiClient
Task<ItemsResult> GetAlbumArtistsAsync(ArtistsQuery query);
/// <summary>
- /// Gets a studio
- /// </summary>
- /// <param name="name">The name.</param>
- /// <param name="userId">The user id.</param>
- /// <returns>Task{BaseItemDto}.</returns>
- /// <exception cref="ArgumentNullException">userId</exception>
- Task<BaseItemDto> GetStudioAsync(string name, string userId);
-
- /// <summary>
/// Gets the next up async.
/// </summary>
/// <param name="query">The query.</param>
@@ -495,15 +486,6 @@ namespace MediaBrowser.Model.ApiClient
Task<BaseItemDto> GetGameGenreAsync(string name, string userId);
/// <summary>
- /// Gets the artist async.
- /// </summary>
- /// <param name="name">The name.</param>
- /// <param name="userId">The user id.</param>
- /// <returns>Task{BaseItemDto}.</returns>
- /// <exception cref="ArgumentNullException">name</exception>
- Task<BaseItemDto> GetArtistAsync(string name, string userId);
-
- /// <summary>
/// Restarts the server.
/// </summary>
/// <returns>Task.</returns>
@@ -1014,14 +996,6 @@ namespace MediaBrowser.Model.ApiClient
/// <summary>
/// Gets an image url that can be used to download an image from the api
/// </summary>
- /// <param name="year">The year.</param>
- /// <param name="options">The options.</param>
- /// <returns>System.String.</returns>
- string GetYearImageUrl(int year, ImageOptions options);
-
- /// <summary>
- /// Gets an image url that can be used to download an image from the api
- /// </summary>
/// <param name="name">The name.</param>
/// <param name="options">The options.</param>
/// <returns>System.String.</returns>
@@ -1045,24 +1019,6 @@ namespace MediaBrowser.Model.ApiClient
string GetGameGenreImageUrl(string name, ImageOptions options);
/// <summary>
- /// Gets an image url that can be used to download an image from the api
- /// </summary>
- /// <param name="name">The name.</param>
- /// <param name="options">The options.</param>
- /// <returns>System.String.</returns>
- /// <exception cref="ArgumentNullException">name</exception>
- string GetStudioImageUrl(string name, ImageOptions options);
-
- /// <summary>
- /// Gets the artist image URL.
- /// </summary>
- /// <param name="name">The name.</param>
- /// <param name="options">The options.</param>
- /// <returns>System.String.</returns>
- /// <exception cref="ArgumentNullException">name</exception>
- string GetArtistImageUrl(string name, ImageOptions options);
-
- /// <summary>
/// This is a helper to get a list of backdrop url's from a given ApiBaseItemWrapper. If the actual item does not have any backdrops it will return backdrops from the first parent that does.
/// </summary>
/// <param name="item">A given item.</param>
diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs
index bb57e9d47..c06aedb50 100644
--- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs
+++ b/MediaBrowser.Model/Configuration/ServerConfiguration.cs
@@ -45,6 +45,12 @@ namespace MediaBrowser.Model.Configuration
public bool EnableHttps { get; set; }
/// <summary>
+ /// Gets or sets a value indicating whether [enable user specific user views].
+ /// </summary>
+ /// <value><c>true</c> if [enable user specific user views]; otherwise, <c>false</c>.</value>
+ public bool EnableUserSpecificUserViews { get; set; }
+
+ /// <summary>
/// Gets or sets the value pointing to the file system where the ssl certiifcate is located..
/// </summary>
/// <value>The value pointing to the file system where the ssl certiifcate is located..</value>
diff --git a/MediaBrowser.Model/Dto/BaseItemDto.cs b/MediaBrowser.Model/Dto/BaseItemDto.cs
index 113a4c6f4..7a1c78112 100644
--- a/MediaBrowser.Model/Dto/BaseItemDto.cs
+++ b/MediaBrowser.Model/Dto/BaseItemDto.cs
@@ -467,6 +467,12 @@ namespace MediaBrowser.Model.Dto
public List<string> Artists { get; set; }
/// <summary>
+ /// Gets or sets the artist items.
+ /// </summary>
+ /// <value>The artist items.</value>
+ public List<NameIdPair> ArtistItems { get; set; }
+
+ /// <summary>
/// Gets or sets the album.
/// </summary>
/// <value>The album.</value>
@@ -508,6 +514,12 @@ namespace MediaBrowser.Model.Dto
public string AlbumArtist { get; set; }
/// <summary>
+ /// Gets or sets the album artists.
+ /// </summary>
+ /// <value>The album artists.</value>
+ public List<NameIdPair> AlbumArtists { get; set; }
+
+ /// <summary>
/// Gets or sets the name of the season.
/// </summary>
/// <value>The name of the season.</value>
diff --git a/MediaBrowser.Model/Dto/NameIdPair.cs b/MediaBrowser.Model/Dto/NameIdPair.cs
new file mode 100644
index 000000000..d3931516c
--- /dev/null
+++ b/MediaBrowser.Model/Dto/NameIdPair.cs
@@ -0,0 +1,17 @@
+
+namespace MediaBrowser.Model.Dto
+{
+ public class NameIdPair
+ {
+ /// <summary>
+ /// Gets or sets the name.
+ /// </summary>
+ /// <value>The name.</value>
+ public string Name { get; set; }
+ /// <summary>
+ /// Gets or sets the identifier.
+ /// </summary>
+ /// <value>The identifier.</value>
+ public string Id { get; set; }
+ }
+}
diff --git a/MediaBrowser.Model/LiveTv/RecordingInfoDto.cs b/MediaBrowser.Model/LiveTv/RecordingInfoDto.cs
index a6cd85d8d..d6d698038 100644
--- a/MediaBrowser.Model/LiveTv/RecordingInfoDto.cs
+++ b/MediaBrowser.Model/LiveTv/RecordingInfoDto.cs
@@ -273,6 +273,10 @@ namespace MediaBrowser.Model.LiveTv
/// <value>The type.</value>
public string Type { get; set; }
+ /// <summary>
+ /// Gets or sets the media sources.
+ /// </summary>
+ /// <value>The media sources.</value>
public List<MediaSourceInfo> MediaSources { get; set; }
public RecordingInfoDto()
diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj
index 14ec093ec..601ba6dc1 100644
--- a/MediaBrowser.Model/MediaBrowser.Model.csproj
+++ b/MediaBrowser.Model/MediaBrowser.Model.csproj
@@ -139,6 +139,7 @@
<Compile Include="Drawing\ImageOrientation.cs" />
<Compile Include="Dto\IHasServerId.cs" />
<Compile Include="Dto\MetadataEditorInfo.cs" />
+ <Compile Include="Dto\NameIdPair.cs" />
<Compile Include="Dto\NameValuePair.cs" />
<Compile Include="MediaInfo\LiveMediaInfoResult.cs" />
<Compile Include="Dto\MediaSourceType.cs" />
@@ -321,7 +322,6 @@
<Compile Include="Querying\QueryResult.cs" />
<Compile Include="Querying\SeasonQuery.cs" />
<Compile Include="Querying\SessionQuery.cs" />
- <Compile Include="Querying\SimilarItemsByNameQuery.cs" />
<Compile Include="Querying\SimilarItemsQuery.cs" />
<Compile Include="Querying\UpcomingEpisodesQuery.cs" />
<Compile Include="Querying\UserQuery.cs" />
diff --git a/MediaBrowser.Model/Querying/ItemQuery.cs b/MediaBrowser.Model/Querying/ItemQuery.cs
index 0f929fa9b..6d26a2c0a 100644
--- a/MediaBrowser.Model/Querying/ItemQuery.cs
+++ b/MediaBrowser.Model/Querying/ItemQuery.cs
@@ -39,11 +39,11 @@ namespace MediaBrowser.Model.Querying
public string[] SortBy { get; set; }
/// <summary>
- /// Filter by artists
+ /// Gets or sets the artist ids.
/// </summary>
- /// <value>The artists.</value>
- public string[] Artists { get; set; }
-
+ /// <value>The artist ids.</value>
+ public string[] ArtistIds { get; set; }
+
/// <summary>
/// The sort order to return results with
/// </summary>
@@ -93,16 +93,10 @@ namespace MediaBrowser.Model.Querying
public string[] Genres { get; set; }
/// <summary>
- /// Limit results to items containing specific genres
- /// </summary>
- /// <value>The genres.</value>
- public string[] AllGenres { get; set; }
-
- /// <summary>
- /// Limit results to items containing specific studios
+ /// Gets or sets the studio ids.
/// </summary>
- /// <value>The studios.</value>
- public string[] Studios { get; set; }
+ /// <value>The studio ids.</value>
+ public string[] StudioIds { get; set; }
/// <summary>
/// Gets or sets the exclude item types.
@@ -306,13 +300,13 @@ namespace MediaBrowser.Model.Querying
VideoTypes = new VideoType[] { };
Genres = new string[] { };
- Studios = new string[] { };
+ StudioIds = new string[] { };
IncludeItemTypes = new string[] { };
ExcludeItemTypes = new string[] { };
Years = new int[] { };
PersonTypes = new string[] { };
Ids = new string[] { };
- Artists = new string[] { };
+ ArtistIds = new string[] { };
ImageTypes = new ImageType[] { };
AirDays = new DayOfWeek[] { };
diff --git a/MediaBrowser.Model/Querying/SimilarItemsByNameQuery.cs b/MediaBrowser.Model/Querying/SimilarItemsByNameQuery.cs
deleted file mode 100644
index 7d0d4da31..000000000
--- a/MediaBrowser.Model/Querying/SimilarItemsByNameQuery.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-namespace MediaBrowser.Model.Querying
-{
- public class SimilarItemsByNameQuery
- {
- /// <summary>
- /// The user to localize search results for
- /// </summary>
- /// <value>The user id.</value>
- public string UserId { get; set; }
-
- /// <summary>
- /// Gets or sets the name.
- /// </summary>
- /// <value>The name.</value>
- public string Name { get; set; }
-
- /// <summary>
- /// The maximum number of items to return
- /// </summary>
- /// <value>The limit.</value>
- public int? Limit { get; set; }
-
- /// <summary>
- /// Fields to return within the items, in addition to basic information
- /// </summary>
- /// <value>The fields.</value>
- public ItemFields[] Fields { get; set; }
- }
-} \ No newline at end of file
diff --git a/MediaBrowser.Providers/FolderImages/DefaultImageProvider.cs b/MediaBrowser.Providers/FolderImages/DefaultImageProvider.cs
index 8ddbbba7d..73a1de889 100644
--- a/MediaBrowser.Providers/FolderImages/DefaultImageProvider.cs
+++ b/MediaBrowser.Providers/FolderImages/DefaultImageProvider.cs
@@ -12,7 +12,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.FolderImages
{
- public class DefaultImageProvider : IRemoteImageProvider, IHasItemChangeMonitor
+ public class DefaultImageProvider : IRemoteImageProvider, IHasItemChangeMonitor, IHasOrder
{
private readonly IHttpClient _httpClient;
@@ -36,36 +36,42 @@ namespace MediaBrowser.Providers.FolderImages
if (view != null)
{
- return GetImages(view.ViewType, cancellationToken);
+ return GetImages(view.ViewType, view.ParentId != Guid.Empty, cancellationToken);
}
var folder = (ICollectionFolder)item;
- return GetImages(folder.CollectionType, cancellationToken);
+ return GetImages(folder.CollectionType, false, cancellationToken);
}
- private Task<IEnumerable<RemoteImageInfo>> GetImages(string viewType, CancellationToken cancellationToken)
+ private Task<IEnumerable<RemoteImageInfo>> GetImages(string viewType, bool isSubView, CancellationToken cancellationToken)
{
- var url = GetImageUrl(viewType);
+ var url = GetImageUrl(viewType, isSubView);
+ var list = new List<RemoteImageInfo>();
- return Task.FromResult<IEnumerable<RemoteImageInfo>>(new List<RemoteImageInfo>
+ if (!string.IsNullOrWhiteSpace(url))
{
- new RemoteImageInfo
- {
- ProviderName = Name,
- Url = url,
- Type = ImageType.Primary
- },
-
- new RemoteImageInfo
- {
- ProviderName = Name,
- Url = url,
- Type = ImageType.Thumb
- }
- });
+ list.AddRange(new List<RemoteImageInfo>
+ {
+ new RemoteImageInfo
+ {
+ ProviderName = Name,
+ Url = url,
+ Type = ImageType.Primary
+ },
+
+ new RemoteImageInfo
+ {
+ ProviderName = Name,
+ Url = url,
+ Type = ImageType.Thumb
+ }
+ });
+ }
+
+ return Task.FromResult<IEnumerable<RemoteImageInfo>>(list);
}
- private string GetImageUrl(string viewType)
+ private string GetImageUrl(string viewType, bool isSubView)
{
const string urlPrefix = "https://raw.githubusercontent.com/MediaBrowser/MediaBrowser.Resources/master/images/folders/";
@@ -102,6 +108,11 @@ namespace MediaBrowser.Providers.FolderImages
return urlPrefix + "movies.png";
}
+ if (isSubView)
+ {
+ return null;
+ }
+
return urlPrefix + "generic.png";
}
@@ -112,14 +123,7 @@ namespace MediaBrowser.Providers.FolderImages
public bool Supports(IHasImages item)
{
- var view = item as UserView;
-
- if (view != null)
- {
- return !view.UserId.HasValue;
- }
-
- return item is ICollectionFolder;
+ return item is ICollectionFolder || item is UserView;
}
public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken)
@@ -136,5 +140,14 @@ namespace MediaBrowser.Providers.FolderImages
{
return GetSupportedImages(item).Any(i => !item.HasImage(i));
}
+
+ public int Order
+ {
+ get
+ {
+ // Run after the dynamic image provider
+ return 1;
+ }
+ }
}
}
diff --git a/MediaBrowser.Providers/Manager/ItemImageProvider.cs b/MediaBrowser.Providers/Manager/ItemImageProvider.cs
index 66b0f9259..3c75aa20a 100644
--- a/MediaBrowser.Providers/Manager/ItemImageProvider.cs
+++ b/MediaBrowser.Providers/Manager/ItemImageProvider.cs
@@ -135,17 +135,17 @@ namespace MediaBrowser.Providers.Manager
{
if (!string.IsNullOrEmpty(response.Path))
{
- var mimeType = "image/" + Path.GetExtension(response.Path).TrimStart('.').ToLower();
+ var mimeType = MimeTypes.GetMimeType(response.Path);
var stream = _fileSystem.GetFileStream(response.Path, FileMode.Open, FileAccess.Read, FileShare.Read, true);
- await _providerManager.SaveImage(item, stream, mimeType, imageType, null, cancellationToken).ConfigureAwait(false);
+ await _providerManager.SaveImage(item, stream, mimeType, imageType, null, response.InternalCacheKey, cancellationToken).ConfigureAwait(false);
}
else
{
var mimeType = "image/" + response.Format.ToString().ToLower();
- await _providerManager.SaveImage(item, response.Stream, mimeType, imageType, null, cancellationToken).ConfigureAwait(false);
+ await _providerManager.SaveImage(item, response.Stream, mimeType, imageType, null, response.InternalCacheKey, cancellationToken).ConfigureAwait(false);
}
downloadedImages.Add(imageType);
diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs
index 55a454977..392fcd5ae 100644
--- a/MediaBrowser.Providers/Manager/ProviderManager.cs
+++ b/MediaBrowser.Providers/Manager/ProviderManager.cs
@@ -26,7 +26,7 @@ namespace MediaBrowser.Providers.Manager
/// <summary>
/// Class ProviderManager
/// </summary>
- public class ProviderManager : IProviderManager
+ public class ProviderManager : IProviderManager, IDisposable
{
/// <summary>
/// The _logger
@@ -63,6 +63,8 @@ namespace MediaBrowser.Providers.Manager
private IExternalId[] _externalIds;
+ private readonly Func<ILibraryManager> _libraryManagerFactory;
+
/// <summary>
/// Initializes a new instance of the <see cref="ProviderManager" /> class.
/// </summary>
@@ -71,7 +73,7 @@ namespace MediaBrowser.Providers.Manager
/// <param name="libraryMonitor">The directory watchers.</param>
/// <param name="logManager">The log manager.</param>
/// <param name="fileSystem">The file system.</param>
- public ProviderManager(IHttpClient httpClient, IServerConfigurationManager configurationManager, ILibraryMonitor libraryMonitor, ILogManager logManager, IFileSystem fileSystem, IServerApplicationPaths appPaths)
+ public ProviderManager(IHttpClient httpClient, IServerConfigurationManager configurationManager, ILibraryMonitor libraryMonitor, ILogManager logManager, IFileSystem fileSystem, IServerApplicationPaths appPaths, Func<ILibraryManager> libraryManagerFactory)
{
_logger = logManager.GetLogger("ProviderManager");
_httpClient = httpClient;
@@ -79,6 +81,7 @@ namespace MediaBrowser.Providers.Manager
_libraryMonitor = libraryMonitor;
_fileSystem = fileSystem;
_appPaths = appPaths;
+ _libraryManagerFactory = libraryManagerFactory;
}
/// <summary>
@@ -841,5 +844,80 @@ namespace MediaBrowser.Providers.Manager
});
}
+
+ private readonly ConcurrentQueue<Tuple<Guid, MetadataRefreshOptions>> _refreshQueue =
+ new ConcurrentQueue<Tuple<Guid, MetadataRefreshOptions>>();
+
+ private readonly object _refreshTimerLock = new object();
+ private Timer _refreshTimer;
+
+ public void QueueRefresh(Guid id, MetadataRefreshOptions options)
+ {
+ if (_disposed)
+ {
+ return;
+ }
+
+ _refreshQueue.Enqueue(new Tuple<Guid, MetadataRefreshOptions>(id, options));
+ StartRefreshTimer();
+ }
+
+ private void StartRefreshTimer()
+ {
+ lock (_refreshTimerLock)
+ {
+ if (_refreshTimer == null)
+ {
+ _refreshTimer = new Timer(RefreshTimerCallback, null, 100, Timeout.Infinite);
+ }
+ }
+ }
+
+ private void StopRefreshTimer()
+ {
+ lock (_refreshTimerLock)
+ {
+ if (_refreshTimer != null)
+ {
+ _refreshTimer.Dispose();
+ _refreshTimer = null;
+ }
+ }
+ }
+
+ private async void RefreshTimerCallback(object state)
+ {
+ Tuple<Guid, MetadataRefreshOptions> refreshItem;
+ var libraryManager = _libraryManagerFactory();
+
+ while (_refreshQueue.TryDequeue(out refreshItem))
+ {
+ if (_disposed)
+ {
+ return;
+ }
+
+ try
+ {
+ var item = libraryManager.GetItemById(refreshItem.Item1);
+ if (item != null)
+ {
+ await item.RefreshMetadata(refreshItem.Item2, CancellationToken.None).ConfigureAwait(false);
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error refreshing item", ex);
+ }
+ }
+
+ StopRefreshTimer();
+ }
+
+ private bool _disposed;
+ public void Dispose()
+ {
+ _disposed = true;
+ }
}
} \ No newline at end of file
diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs b/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs
index 26d00d544..ea191dd08 100644
--- a/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs
+++ b/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfo.cs
@@ -387,7 +387,7 @@ namespace MediaBrowser.Providers.MediaInfo
if (!string.IsNullOrEmpty(val))
{
// Sometimes the artist name is listed here, account for that
- var studios = Split(val, true).Where(i => !audio.HasArtist(i));
+ var studios = Split(val, true).Where(i => !audio.HasAnyArtist(i));
foreach (var studio in studios)
{
diff --git a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs
index 2b17442de..f0f30229e 100644
--- a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs
+++ b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs
@@ -1400,7 +1400,9 @@ namespace MediaBrowser.Server.Implementations.Channels
public async Task<Folder> GetInternalChannelFolder(string userId, CancellationToken cancellationToken)
{
var name = _localization.GetLocalizedString("ViewTypeChannels");
- return await _libraryManager.GetNamedView(name, "channels", "zz_" + name, cancellationToken).ConfigureAwait(false);
+ var user = _userManager.GetUserById(userId);
+
+ return await _libraryManager.GetNamedView(user, name, "channels", "zz_" + name, cancellationToken).ConfigureAwait(false);
}
public async Task DownloadChannelItem(IChannelMediaItem item, string destination,
diff --git a/MediaBrowser.Server.Implementations/Collections/CollectionImageProvider.cs b/MediaBrowser.Server.Implementations/Collections/CollectionImageProvider.cs
index b756fb6c4..80a7c50d1 100644
--- a/MediaBrowser.Server.Implementations/Collections/CollectionImageProvider.cs
+++ b/MediaBrowser.Server.Implementations/Collections/CollectionImageProvider.cs
@@ -14,7 +14,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Server.Implementations.Collections
{
- public class CollectionImageProvider : BaseDynamicImageProvider<BoxSet>, ICustomMetadataProvider<BoxSet>
+ public class CollectionImageProvider : BaseDynamicImageProvider<BoxSet>
{
public CollectionImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths) : base(fileSystem, providerManager, applicationPaths)
{
diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs
index f9b7470b2..3280cf264 100644
--- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs
+++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs
@@ -504,7 +504,6 @@ namespace MediaBrowser.Server.Implementations.Dto
}
dto.Album = item.Album;
- dto.Artists = item.Artists;
}
private void SetGameProperties(BaseItemDto dto, Game item)
@@ -1142,7 +1141,6 @@ namespace MediaBrowser.Server.Implementations.Dto
if (audio != null)
{
dto.Album = audio.Album;
- dto.Artists = audio.Artists;
var albumParent = audio.FindParent<MusicAlbum>();
@@ -1163,18 +1161,65 @@ namespace MediaBrowser.Server.Implementations.Dto
if (album != null)
{
- dto.Artists = album.Artists;
-
dto.SoundtrackIds = album.SoundtrackIds
.Select(i => i.ToString("N"))
.ToArray();
}
- var hasAlbumArtist = item as IHasAlbumArtist;
+ var hasArtist = item as IHasArtist;
+ if (hasArtist != null)
+ {
+ dto.Artists = hasArtist.Artists;
+
+ dto.ArtistItems = hasArtist
+ .Artists
+ .Select(i =>
+ {
+ try
+ {
+ var artist = _libraryManager.GetArtist(i);
+ return new NameIdPair
+ {
+ Name = artist.Name,
+ Id = artist.Id.ToString("N")
+ };
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error getting artist", ex);
+ return null;
+ }
+ })
+ .Where(i => i != null)
+ .ToList();
+ }
+ var hasAlbumArtist = item as IHasAlbumArtist;
if (hasAlbumArtist != null)
{
dto.AlbumArtist = hasAlbumArtist.AlbumArtists.FirstOrDefault();
+
+ dto.AlbumArtists = hasAlbumArtist
+ .AlbumArtists
+ .Select(i =>
+ {
+ try
+ {
+ var artist = _libraryManager.GetArtist(i);
+ return new NameIdPair
+ {
+ Name = artist.Name,
+ Id = artist.Id.ToString("N")
+ };
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error getting album artist", ex);
+ return null;
+ }
+ })
+ .Where(i => i != null)
+ .ToList();
}
// Add video info
@@ -1231,7 +1276,6 @@ namespace MediaBrowser.Server.Implementations.Dto
// Add MovieInfo
var movie = item as Movie;
-
if (movie != null)
{
if (fields.Contains(ItemFields.TmdbCollectionName))
@@ -1241,7 +1285,6 @@ namespace MediaBrowser.Server.Implementations.Dto
}
var hasSpecialFeatures = item as IHasSpecialFeatures;
-
if (hasSpecialFeatures != null)
{
var specialFeatureCount = hasSpecialFeatures.SpecialFeatureIds.Count;
@@ -1254,7 +1297,6 @@ namespace MediaBrowser.Server.Implementations.Dto
// Add EpisodeInfo
var episode = item as Episode;
-
if (episode != null)
{
dto.IndexNumberEnd = episode.IndexNumberEnd;
@@ -1296,7 +1338,6 @@ namespace MediaBrowser.Server.Implementations.Dto
// Add SeriesInfo
var series = item as Series;
-
if (series != null)
{
dto.AirDays = series.AirDays;
@@ -1346,7 +1387,6 @@ namespace MediaBrowser.Server.Implementations.Dto
// Add SeasonInfo
var season = item as Season;
-
if (season != null)
{
series = season.Series;
@@ -1380,7 +1420,6 @@ namespace MediaBrowser.Server.Implementations.Dto
}
var musicVideo = item as MusicVideo;
-
if (musicVideo != null)
{
SetMusicVideoProperties(dto, musicVideo);
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
index 070b111ee..f6809c924 100644
--- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
@@ -1584,15 +1584,22 @@ namespace MediaBrowser.Server.Implementations.Library
.FirstOrDefault(i => !string.IsNullOrWhiteSpace(i));
}
- public async Task<UserView> GetNamedView(string name,
- string type,
+ public async Task<UserView> GetNamedView(User user,
+ string name,
+ string viewType,
string sortName,
CancellationToken cancellationToken)
{
+ if (ConfigurationManager.Configuration.EnableUserSpecificUserViews)
+ {
+ return await GetNamedViewInternal(user, name, null, viewType, sortName, cancellationToken)
+ .ConfigureAwait(false);
+ }
+
var path = Path.Combine(ConfigurationManager.ApplicationPaths.ItemsByNamePath,
"views");
- path = Path.Combine(path, _fileSystem.GetValidFilename(type));
+ path = Path.Combine(path, _fileSystem.GetValidFilename(viewType));
var id = GetNewItemId(path + "_namedview_" + name, typeof(UserView));
@@ -1611,7 +1618,7 @@ namespace MediaBrowser.Server.Implementations.Library
Id = id,
DateCreated = DateTime.UtcNow,
Name = name,
- ViewType = type,
+ ViewType = viewType,
ForcedSortName = sortName
};
@@ -1627,31 +1634,38 @@ namespace MediaBrowser.Server.Implementations.Library
if (refresh)
{
- await item.RefreshMetadata(new MetadataRefreshOptions
- {
- ForceSave = true
-
- }, cancellationToken).ConfigureAwait(false);
+ await item.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None).ConfigureAwait(false);
+ _providerManagerFactory().QueueRefresh(item.Id, new MetadataRefreshOptions());
}
return item;
}
- public async Task<UserView> GetSpecialFolder(User user,
+ public Task<UserView> GetNamedView(User user,
string name,
string parentId,
string viewType,
string sortName,
CancellationToken cancellationToken)
{
- if (string.IsNullOrWhiteSpace(name))
+ if (string.IsNullOrWhiteSpace(parentId))
{
- throw new ArgumentNullException("name");
+ throw new ArgumentNullException("parentId");
}
- if (string.IsNullOrWhiteSpace(parentId))
+ return GetNamedViewInternal(user, name, parentId, viewType, sortName, cancellationToken);
+ }
+
+ private async Task<UserView> GetNamedViewInternal(User user,
+ string name,
+ string parentId,
+ string viewType,
+ string sortName,
+ CancellationToken cancellationToken)
+ {
+ if (string.IsNullOrWhiteSpace(name))
{
- throw new ArgumentNullException("parentId");
+ throw new ArgumentNullException("name");
}
if (string.IsNullOrWhiteSpace(viewType))
@@ -1659,9 +1673,9 @@ namespace MediaBrowser.Server.Implementations.Library
throw new ArgumentNullException("viewType");
}
- var id = GetNewItemId("7_namedview_" + name + user.Id.ToString("N") + parentId, typeof(UserView));
+ var id = GetNewItemId("23_namedview_" + name + user.Id.ToString("N") + (parentId ?? string.Empty), typeof(UserView));
- var path = Path.Combine(ConfigurationManager.ApplicationPaths.InternalMetadataPath, "views", "specialviews", id.ToString("N"));
+ var path = Path.Combine(ConfigurationManager.ApplicationPaths.InternalMetadataPath, "views", id.ToString("N"));
var item = GetItemById(id) as UserView;
@@ -1679,27 +1693,28 @@ namespace MediaBrowser.Server.Implementations.Library
Name = name,
ViewType = viewType,
ForcedSortName = sortName,
- UserId = user.Id,
- ParentId = new Guid(parentId)
+ UserId = user.Id
};
+ if (!string.IsNullOrWhiteSpace(parentId))
+ {
+ item.ParentId = new Guid(parentId);
+ }
+
await CreateItem(item, cancellationToken).ConfigureAwait(false);
refresh = true;
}
- if (!refresh && item != null)
+ if (!refresh)
{
refresh = (DateTime.UtcNow - item.DateLastSaved).TotalHours >= 24;
}
if (refresh)
{
- await item.RefreshMetadata(new MetadataRefreshOptions
- {
- ForceSave = true
-
- }, cancellationToken).ConfigureAwait(false);
+ await item.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None).ConfigureAwait(false);
+ _providerManagerFactory().QueueRefresh(item.Id, new MetadataRefreshOptions());
}
return item;
@@ -1849,7 +1864,7 @@ namespace MediaBrowser.Server.Implementations.Library
// These cause apps to have problems
options.AudioFileExtensions.Remove(".m3u");
options.AudioFileExtensions.Remove(".wpl");
-
+
if (!ConfigurationManager.Configuration.EnableAudioArchiveFiles)
{
options.AudioFileExtensions.Remove(".rar");
diff --git a/MediaBrowser.Server.Implementations/Library/MusicManager.cs b/MediaBrowser.Server.Implementations/Library/MusicManager.cs
index 7733e7d37..3a854f2fe 100644
--- a/MediaBrowser.Server.Implementations/Library/MusicManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/MusicManager.cs
@@ -34,7 +34,7 @@ namespace MediaBrowser.Server.Implementations.Library
var genres = user.RootFolder
.GetRecursiveChildren(user, i => i is Audio)
.Cast<Audio>()
- .Where(i => i.HasArtist(name))
+ .Where(i => i.HasAnyArtist(name))
.SelectMany(i => i.Genres)
.Concat(artist.Genres)
.Distinct(StringComparer.OrdinalIgnoreCase);
diff --git a/MediaBrowser.Server.Implementations/Library/UserViewManager.cs b/MediaBrowser.Server.Implementations/Library/UserViewManager.cs
index 8b7cfa9f2..a583534ee 100644
--- a/MediaBrowser.Server.Implementations/Library/UserViewManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/UserViewManager.cs
@@ -70,40 +70,41 @@ namespace MediaBrowser.Server.Implementations.Library
if (foldersWithViewTypes.Any(i => string.Equals(i.CollectionType, CollectionType.TvShows, StringComparison.OrdinalIgnoreCase)) ||
foldersWithViewTypes.Any(i => string.IsNullOrWhiteSpace(i.CollectionType)))
{
- list.Add(await GetUserView(CollectionType.TvShows, string.Empty, cancellationToken).ConfigureAwait(false));
+ list.Add(await GetUserView(CollectionType.TvShows, string.Empty, user, cancellationToken).ConfigureAwait(false));
}
if (foldersWithViewTypes.Any(i => string.Equals(i.CollectionType, CollectionType.Music, StringComparison.OrdinalIgnoreCase)) ||
foldersWithViewTypes.Any(i => string.Equals(i.CollectionType, CollectionType.MusicVideos, StringComparison.OrdinalIgnoreCase)))
{
- list.Add(await GetUserView(CollectionType.Music, string.Empty, cancellationToken).ConfigureAwait(false));
+ list.Add(await GetUserView(CollectionType.Music, string.Empty, user, cancellationToken).ConfigureAwait(false));
}
if (foldersWithViewTypes.Any(i => string.Equals(i.CollectionType, CollectionType.Movies, StringComparison.OrdinalIgnoreCase)) ||
foldersWithViewTypes.Any(i => string.IsNullOrWhiteSpace(i.CollectionType)))
{
- list.Add(await GetUserView(CollectionType.Movies, string.Empty, cancellationToken).ConfigureAwait(false));
+ list.Add(await GetUserView(CollectionType.Movies, string.Empty, user, cancellationToken).ConfigureAwait(false));
}
if (foldersWithViewTypes.Any(i => string.Equals(i.CollectionType, CollectionType.Games, StringComparison.OrdinalIgnoreCase)))
{
- list.Add(await GetUserView(CollectionType.Games, string.Empty, cancellationToken).ConfigureAwait(false));
+ list.Add(await GetUserView(CollectionType.Games, string.Empty, user, cancellationToken).ConfigureAwait(false));
}
if (foldersWithViewTypes.Any(i => string.Equals(i.CollectionType, CollectionType.BoxSets, StringComparison.OrdinalIgnoreCase)))
{
//list.Add(_collectionManager.GetCollectionsFolder(user.Id.ToString("N")));
- list.Add(await GetUserView(CollectionType.BoxSets, string.Empty, cancellationToken).ConfigureAwait(false));
+ list.Add(await GetUserView(CollectionType.BoxSets, string.Empty, user, cancellationToken).ConfigureAwait(false));
}
if (foldersWithViewTypes.Any(i => string.Equals(i.CollectionType, CollectionType.Playlists, StringComparison.OrdinalIgnoreCase)))
{
- list.Add(_playlists.GetPlaylistsFolder(user.Id.ToString("N")));
+ //list.Add(_playlists.GetPlaylistsFolder(user.Id.ToString("N")));
+ list.Add(await GetUserView(CollectionType.Playlists, string.Empty, user, cancellationToken).ConfigureAwait(false));
}
if (user.Configuration.DisplayFoldersView)
{
- list.Add(await GetUserView(CollectionType.Folders, "zz_" + CollectionType.Folders, cancellationToken).ConfigureAwait(false));
+ list.Add(await GetUserView(CollectionType.Folders, "zz_" + CollectionType.Folders, user, cancellationToken).ConfigureAwait(false));
}
if (query.IncludeExternalContent)
@@ -148,23 +149,23 @@ namespace MediaBrowser.Server.Implementations.Library
.ThenBy(i => i.SortName);
}
- public Task<UserView> GetUserView(string name, string parentId, string type, User user, string sortName, CancellationToken cancellationToken)
+ public Task<UserView> GetUserSubView(string name, string parentId, string type, User user, string sortName, CancellationToken cancellationToken)
{
- return _libraryManager.GetSpecialFolder(user, name, parentId, type, sortName, cancellationToken);
+ return _libraryManager.GetNamedView(user, name, parentId, type, sortName, cancellationToken);
}
- public Task<UserView> GetUserView(string parentId, string type, User user, string sortName, CancellationToken cancellationToken)
+ public Task<UserView> GetUserSubView(string parentId, string type, User user, string sortName, CancellationToken cancellationToken)
{
var name = _localizationManager.GetLocalizedString("ViewType" + type);
- return GetUserView(name, parentId, type, user, sortName, cancellationToken);
+ return GetUserSubView(name, parentId, type, user, sortName, cancellationToken);
}
- public Task<UserView> GetUserView(string type, string sortName, CancellationToken cancellationToken)
+ public Task<UserView> GetUserView(string type, string sortName, User user, CancellationToken cancellationToken)
{
var name = _localizationManager.GetLocalizedString("ViewType" + type);
- return _libraryManager.GetNamedView(name, type, sortName, cancellationToken);
+ return _libraryManager.GetNamedView(user, name, type, sortName, cancellationToken);
}
public List<Tuple<BaseItem, List<BaseItem>>> GetLatestItems(LatestItemsQuery request)
diff --git a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
index ec5ac3cae..33f1a4dac 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
@@ -1827,7 +1827,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv
public async Task<Folder> GetInternalLiveTvFolder(string userId, CancellationToken cancellationToken)
{
var name = _localization.GetLocalizedString("ViewTypeLiveTV");
- return await _libraryManager.GetNamedView(name, "livetv", "zz_" + name, cancellationToken).ConfigureAwait(false);
+ var user = _userManager.GetUserById(userId);
+ return await _libraryManager.GetNamedView(user, name, "livetv", "zz_" + name, cancellationToken).ConfigureAwait(false);
}
}
}
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/server.json b/MediaBrowser.Server.Implementations/Localization/Server/server.json
index 9464309b7..0805c9ce9 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/server.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/server.json
@@ -926,6 +926,7 @@
"LabelChannelDownloadAgeHelp": "Downloaded content older than this will be deleted. It will remain playable via internet streaming.",
"ChannelSettingsFormHelp": "Install channels such as Trailers and Vimeo in the plugin catalog.",
"ButtonOptions": "Options",
+ "ViewTypePlaylists": "Playlists",
"ViewTypeMovies": "Movies",
"ViewTypeTvShows": "TV",
"ViewTypeGames": "Games",
@@ -1172,6 +1173,7 @@
"LabelIfYouWishToContinueWithDeletion": "If you wish to continue, please confirm by entering the value of:",
"ButtonIdentify": "Identify",
"LabelAlbumArtist": "Album artist:",
+ "LabelAlbumArtists": "Album artists:",
"LabelAlbum": "Album:",
"LabelCommunityRating": "Community rating:",
"LabelVoteCount": "Vote count:",
diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
index 6292defc1..396d378bc 100644
--- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
+++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
@@ -248,6 +248,7 @@
<Compile Include="Persistence\TypeMapper.cs" />
<Compile Include="Photos\BaseDynamicImageProvider.cs" />
<Compile Include="Photos\DynamicImageHelpers.cs" />
+ <Compile Include="Photos\StripCollageBuilder.cs" />
<Compile Include="Playlists\ManualPlaylistsFolder.cs" />
<Compile Include="Photos\PhotoAlbumImageProvider.cs" />
<Compile Include="Playlists\PlaylistImageProvider.cs" />
@@ -428,6 +429,7 @@
<EmbeddedResource Include="Localization\Server\uk.json" />
<EmbeddedResource Include="Drawing\fonts\webdings.ttf" />
<EmbeddedResource Include="Drawing\fonts\robotoregular.ttf" />
+ <EmbeddedResource Include="Drawing\fonts\MontserratLight.otf" />
<None Include="Localization\JavaScript\sl_SI.json" />
<EmbeddedResource Include="Localization\Server\sl_SI.json" />
<None Include="packages.config" />
diff --git a/MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs b/MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs
index 40b85dad1..9cae36283 100644
--- a/MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs
+++ b/MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs
@@ -2,8 +2,8 @@
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.IO;
using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Drawing;
using MediaBrowser.Model.Entities;
using System;
using System.Collections.Generic;
@@ -15,8 +15,8 @@ using System.Threading.Tasks;
namespace MediaBrowser.Server.Implementations.Photos
{
- public abstract class BaseDynamicImageProvider<T> : IHasChangeMonitor, IForcedProvider
- where T : IHasImages
+ public abstract class BaseDynamicImageProvider<T> : IHasChangeMonitor, IForcedProvider, IDynamicImageProvider, IHasOrder
+ where T : IHasMetadata
{
protected IFileSystem FileSystem { get; private set; }
protected IProviderManager ProviderManager { get; private set; }
@@ -29,81 +29,51 @@ namespace MediaBrowser.Server.Implementations.Photos
FileSystem = fileSystem;
}
- public async Task<ItemUpdateType> FetchAsync(T item, MetadataRefreshOptions options, CancellationToken cancellationToken)
+ public virtual bool Supports(IHasImages item)
{
- if (!Supports(item))
- {
- return ItemUpdateType.None;
- }
-
- var primaryResult = await FetchAsync(item, ImageType.Primary, options, cancellationToken).ConfigureAwait(false);
- var thumbResult = await FetchAsync(item, ImageType.Thumb, options, cancellationToken).ConfigureAwait(false);
-
- return primaryResult | thumbResult;
- }
-
- protected virtual bool Supports(IHasImages item)
- {
- return true;
+ return item is T;
}
- protected abstract Task<List<BaseItem>> GetItemsWithImages(IHasImages item);
-
- private const string Version = "3";
- protected string GetConfigurationCacheKey(List<BaseItem> items)
+ public virtual IEnumerable<ImageType> GetSupportedImages(IHasImages item)
{
- return (Version + "_" + string.Join(",", items.Select(i => i.Id.ToString("N")).ToArray())).GetMD5().ToString("N");
+ return new List<ImageType>
+ {
+ ImageType.Primary,
+ ImageType.Thumb
+ };
}
- protected async Task<ItemUpdateType> FetchAsync(IHasImages item, ImageType imageType, MetadataRefreshOptions options, CancellationToken cancellationToken)
+ public async Task<DynamicImageResponse> GetImage(IHasImages item, ImageType type, CancellationToken cancellationToken)
{
var items = await GetItemsWithImages(item).ConfigureAwait(false);
var cacheKey = GetConfigurationCacheKey(items);
- if (!HasChanged(item, imageType, cacheKey))
+ var result = await FetchAsyncInternal(item, items, type, cacheKey, cancellationToken).ConfigureAwait(false);
+
+ return new DynamicImageResponse
{
- return ItemUpdateType.None;
- }
+ HasImage = result != null,
+ Stream = result,
+ InternalCacheKey = cacheKey,
+ Format = ImageFormat.Png
+ };
+ }
+
+ protected abstract Task<List<BaseItem>> GetItemsWithImages(IHasImages item);
- return await FetchAsyncInternal(item, items, imageType, cacheKey, options, cancellationToken).ConfigureAwait(false);
+ private const string Version = "3";
+ protected string GetConfigurationCacheKey(List<BaseItem> items)
+ {
+ return (Version + "_" + string.Join(",", items.Select(i => i.Id.ToString("N")).ToArray())).GetMD5().ToString("N");
}
- protected async Task<ItemUpdateType> FetchAsyncInternal(IHasImages item,
+ protected Task<Stream> FetchAsyncInternal(IHasImages item,
List<BaseItem> itemsWithImages,
- ImageType imageType,
- string cacheKey,
- MetadataRefreshOptions options,
+ ImageType imageType,
+ string cacheKey,
CancellationToken cancellationToken)
{
- var stream = await CreateImageAsync(item, itemsWithImages, imageType, 0).ConfigureAwait(false);
-
- if (stream == null)
- {
- return ItemUpdateType.None;
- }
-
- if (stream is MemoryStream)
- {
- using (stream)
- {
- stream.Position = 0;
-
- await ProviderManager.SaveImage(item, stream, "image/png", imageType, null, cacheKey, cancellationToken).ConfigureAwait(false);
- }
- }
- else
- {
- using (var ms = new MemoryStream())
- {
- await stream.CopyToAsync(ms).ConfigureAwait(false);
-
- ms.Position = 0;
-
- await ProviderManager.SaveImage(item, ms, "image/png", imageType, null, cacheKey, cancellationToken).ConfigureAwait(false);
- }
- }
-
- return ItemUpdateType.ImageUpdate;
+ return CreateImageAsync(item, itemsWithImages, imageType, 0);
}
protected Task<Stream> GetThumbCollage(List<BaseItem> items)
@@ -137,9 +107,9 @@ namespace MediaBrowser.Server.Implementations.Photos
get { return "Dynamic Image Provider"; }
}
- public async Task<Stream> CreateImageAsync(IHasImages item,
+ protected virtual async Task<Stream> CreateImageAsync(IHasImages item,
List<BaseItem> itemsWithImages,
- ImageType imageType,
+ ImageType imageType,
int imageIndex)
{
if (itemsWithImages.Count == 0)
@@ -190,11 +160,17 @@ namespace MediaBrowser.Server.Implementations.Photos
protected List<BaseItem> GetFinalItems(List<BaseItem> items)
{
// Rotate the images no more than once per week
+ return GetFinalItems(items, 4);
+ }
+
+ protected List<BaseItem> GetFinalItems(List<BaseItem> items, int limit)
+ {
+ // Rotate the images no more than once per week
var random = new Random(GetWeekOfYear()).Next();
return items
.OrderBy(i => random - items.IndexOf(i))
- .Take(4)
+ .Take(limit)
.OrderBy(i => i.Name)
.ToList();
}
@@ -209,5 +185,14 @@ namespace MediaBrowser.Server.Implementations.Photos
return weekNo;
}
+
+ public int Order
+ {
+ get
+ {
+ // Run before the default image provider which will download placeholders
+ return 0;
+ }
+ }
}
}
diff --git a/MediaBrowser.Server.Implementations/Photos/DynamicImageHelpers.cs b/MediaBrowser.Server.Implementations/Photos/DynamicImageHelpers.cs
index e7cd2f4d2..fce8c9b6b 100644
--- a/MediaBrowser.Server.Implementations/Photos/DynamicImageHelpers.cs
+++ b/MediaBrowser.Server.Implementations/Photos/DynamicImageHelpers.cs
@@ -107,7 +107,7 @@ namespace MediaBrowser.Server.Implementations.Photos
return Task.FromResult<Stream>(fileSystem.GetFileStream(files[0], FileMode.Open, FileAccess.Read, FileShare.Read));
}
- private static Stream GetStream(MagickWand image, IApplicationPaths appPaths)
+ internal static Stream GetStream(MagickWand image, IApplicationPaths appPaths)
{
var tempFile = Path.Combine(appPaths.TempDirectory, Guid.NewGuid().ToString("N") + ".png");
diff --git a/MediaBrowser.Server.Implementations/Photos/DynamicImageProvider.cs b/MediaBrowser.Server.Implementations/Photos/DynamicImageProvider.cs
index 4e1330144..1a02d413e 100644
--- a/MediaBrowser.Server.Implementations/Photos/DynamicImageProvider.cs
+++ b/MediaBrowser.Server.Implementations/Photos/DynamicImageProvider.cs
@@ -1,6 +1,7 @@
using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.IO;
using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers;
@@ -8,22 +9,42 @@ using MediaBrowser.Model.Entities;
using MoreLinq;
using System;
using System.Collections.Generic;
+using System.IO;
using System.Linq;
using System.Threading.Tasks;
namespace MediaBrowser.Server.Implementations.Photos
{
- public class DynamicImageProvider : BaseDynamicImageProvider<UserView>, ICustomMetadataProvider<UserView>
+ public class DynamicImageProvider : BaseDynamicImageProvider<UserView>
{
private readonly IUserManager _userManager;
private readonly ILibraryManager _libraryManager;
- public DynamicImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IUserManager userManager, ILibraryManager libraryManager) : base(fileSystem, providerManager, applicationPaths)
+ public DynamicImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IUserManager userManager, ILibraryManager libraryManager)
+ : base(fileSystem, providerManager, applicationPaths)
{
_userManager = userManager;
_libraryManager = libraryManager;
}
+ public override IEnumerable<ImageType> GetSupportedImages(IHasImages item)
+ {
+ var view = (UserView)item;
+ if (IsUsingCollectionStrip(view))
+ {
+ return new List<ImageType>
+ {
+ ImageType.Primary
+ };
+ }
+
+ return new List<ImageType>
+ {
+ ImageType.Primary,
+ ImageType.Thumb
+ };
+ }
+
protected override async Task<List<BaseItem>> GetItemsWithImages(IHasImages item)
{
var view = (UserView)item;
@@ -71,9 +92,15 @@ namespace MediaBrowser.Server.Implementations.Photos
return list;
}
+ var isUsingCollectionStrip = IsUsingCollectionStrip(view);
+ var recursive = isUsingCollectionStrip && !new[] {CollectionType.Playlists, CollectionType.Channels}.Contains(view.ViewType ?? string.Empty, StringComparer.OrdinalIgnoreCase);
+
var result = await view.GetItems(new InternalItemsQuery
{
- User = _userManager.GetUserById(view.UserId.Value)
+ User = _userManager.GetUserById(view.UserId.Value),
+ CollapseBoxSetItems = false,
+ Recursive = recursive,
+ ExcludeItemTypes = new[] { "UserView", "CollectionFolder"}
}).ConfigureAwait(false);
@@ -108,14 +135,29 @@ namespace MediaBrowser.Server.Implementations.Photos
return season;
}
+ var audio = i as Audio;
+ if (audio != null)
+ {
+ var album = audio.FindParent<MusicAlbum>();
+ if (album != null && album.HasImage(ImageType.Primary))
+ {
+ return album;
+ }
+ }
+
return i;
}).DistinctBy(i => i.Id);
+ if (isUsingCollectionStrip)
+ {
+ return GetFinalItems(items.Where(i => i.HasImage(ImageType.Primary) || i.HasImage(ImageType.Thumb)).ToList(), 8);
+ }
+
return GetFinalItems(items.Where(i => i.HasImage(ImageType.Primary)).ToList());
}
- protected override bool Supports(IHasImages item)
+ public override bool Supports(IHasImages item)
{
var view = item as UserView;
@@ -160,11 +202,46 @@ namespace MediaBrowser.Server.Implementations.Photos
SpecialFolder.MusicFavoriteSongs
};
- return supported.Contains(view.ViewType, StringComparer.OrdinalIgnoreCase) &&
+ return (IsUsingCollectionStrip(view) || supported.Contains(view.ViewType, StringComparer.OrdinalIgnoreCase)) &&
_userManager.GetUserById(view.UserId.Value) != null;
}
return false;
}
+
+ private bool IsUsingCollectionStrip(UserView view)
+ {
+ string[] collectionStripViewTypes =
+ {
+ CollectionType.Movies,
+ CollectionType.TvShows,
+ CollectionType.Games,
+ CollectionType.Music,
+ CollectionType.BoxSets,
+ CollectionType.Playlists,
+ CollectionType.Channels
+ };
+
+ return collectionStripViewTypes.Contains(view.ViewType ?? string.Empty);
+ }
+
+ protected override Task<Stream> CreateImageAsync(IHasImages item, List<BaseItem> itemsWithImages, ImageType imageType, int imageIndex)
+ {
+ var view = (UserView)item;
+ if (imageType == ImageType.Primary && IsUsingCollectionStrip(view))
+ {
+ var stream = new StripCollageBuilder(ApplicationPaths).BuildThumbCollage(GetStripCollageImagePaths(itemsWithImages), item.Name, 960, 540);
+ return Task.FromResult(stream);
+ }
+
+ return base.CreateImageAsync(item, itemsWithImages, imageType, imageIndex);
+ }
+
+ private IEnumerable<String> GetStripCollageImagePaths(IEnumerable<BaseItem> items)
+ {
+ return items
+ .Select(i => i.GetImagePath(ImageType.Primary) ?? i.GetImagePath(ImageType.Thumb))
+ .Where(i => !string.IsNullOrWhiteSpace(i));
+ }
}
}
diff --git a/MediaBrowser.Server.Implementations/Photos/PhotoAlbumImageProvider.cs b/MediaBrowser.Server.Implementations/Photos/PhotoAlbumImageProvider.cs
index e36986970..73d9183a5 100644
--- a/MediaBrowser.Server.Implementations/Photos/PhotoAlbumImageProvider.cs
+++ b/MediaBrowser.Server.Implementations/Photos/PhotoAlbumImageProvider.cs
@@ -8,7 +8,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Server.Implementations.Photos
{
- public class PhotoAlbumImageProvider : BaseDynamicImageProvider<PhotoAlbum>, ICustomMetadataProvider<PhotoAlbum>
+ public class PhotoAlbumImageProvider : BaseDynamicImageProvider<PhotoAlbum>
{
public PhotoAlbumImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths) : base(fileSystem, providerManager, applicationPaths)
{
diff --git a/MediaBrowser.Server.Implementations/Photos/StripCollageBuilder.cs b/MediaBrowser.Server.Implementations/Photos/StripCollageBuilder.cs
new file mode 100644
index 000000000..6fd33f6e4
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Photos/StripCollageBuilder.cs
@@ -0,0 +1,179 @@
+using ImageMagickSharp;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Server.Implementations.Drawing;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+
+namespace MediaBrowser.Server.Implementations.Photos
+{
+ public class StripCollageBuilder
+ {
+ private readonly IApplicationPaths _appPaths;
+
+ public StripCollageBuilder(IApplicationPaths appPaths)
+ {
+ _appPaths = appPaths;
+ }
+
+ public Stream BuildThumbCollage(IEnumerable<string> paths, string text, int width, int height)
+ {
+ using (var wand = BuildThumbCollageWandWithText(paths, text, width, height))
+ {
+ return DynamicImageHelpers.GetStream(wand, _appPaths);
+ }
+ }
+
+ private string[] ProjectPaths(IEnumerable<string> paths, int count)
+ {
+ var clone = paths.ToList();
+ var list = new List<string>();
+
+ while (list.Count < count)
+ {
+ foreach (var path in clone)
+ {
+ list.Add(path);
+
+ if (list.Count >= count)
+ {
+ break;
+ }
+ }
+ }
+
+ return list.Take(count).ToArray();
+ }
+
+ private MagickWand BuildThumbCollageWandWithText(IEnumerable<string> paths, string text, int width, int height)
+ {
+ var inputPaths = ProjectPaths(paths, 8);
+ using (var wandImages = new MagickWand(inputPaths))
+ {
+ var wand = new MagickWand(width, height);
+ wand.OpenImage("gradient:#111111-#111111");
+ using (var draw = new DrawingWand())
+ {
+ using (var fcolor = new PixelWand(ColorName.White))
+ {
+ draw.FillColor = fcolor;
+ draw.Font = MontserratLightFont;
+ draw.FontSize = 50;
+ draw.FontWeight = FontWeightType.LightStyle;
+ draw.TextAntialias = true;
+ }
+
+ var fontMetrics = wand.QueryFontMetrics(draw, text);
+ var textContainerY = Convert.ToInt32(height * .165);
+ wand.CurrentImage.AnnotateImage(draw, (width - fontMetrics.TextWidth) / 2, textContainerY, 0.0, text);
+
+ var iSlice = Convert.ToInt32(width * .1166666667);
+ int iTrans = Convert.ToInt32(height * 0.2);
+ int iHeight = Convert.ToInt32(height * 0.46296296296296296296296296296296);
+ var horizontalImagePadding = Convert.ToInt32(width * 0.0125);
+
+ foreach (var element in wandImages.ImageList)
+ {
+ int iWidth = (int)Math.Abs(iHeight * element.Width / element.Height);
+ element.Gravity = GravityType.CenterGravity;
+ element.BackgroundColor = new PixelWand("none", 1);
+ element.ResizeImage(iWidth, iHeight, FilterTypes.LanczosFilter);
+ int ix = (int)Math.Abs((iWidth - iSlice) / 2);
+ element.CropImage(iSlice, iHeight, ix, 0);
+
+ element.ExtentImage(iSlice, iHeight, 0 - horizontalImagePadding, 0);
+ }
+
+ wandImages.SetFirstIterator();
+ using (var wandList = wandImages.AppendImages())
+ {
+ wandList.CurrentImage.TrimImage(1);
+ using (var mwr = wandList.CloneMagickWand())
+ {
+ mwr.CurrentImage.ResizeImage(wandList.CurrentImage.Width, (wandList.CurrentImage.Height / 2), FilterTypes.LanczosFilter, 1);
+ mwr.CurrentImage.FlipImage();
+
+ mwr.CurrentImage.AlphaChannel = AlphaChannelType.DeactivateAlphaChannel;
+ mwr.CurrentImage.ColorizeImage(ColorName.Black, ColorName.Grey70);
+
+ using (var mwg = new MagickWand(wandList.CurrentImage.Width, iTrans))
+ {
+ mwg.OpenImage("gradient:black-none");
+ var verticalSpacing = Convert.ToInt32(height * 0.01111111111111111111111111111111);
+ mwr.CurrentImage.CompositeImage(mwg, CompositeOperator.DstInCompositeOp, 0, verticalSpacing);
+
+ wandList.AddImage(mwr);
+ int ex = (int)(wand.CurrentImage.Width - mwg.CurrentImage.Width) / 2;
+ wand.CurrentImage.CompositeImage(wandList.AppendImages(true), CompositeOperator.AtopCompositeOp, ex, Convert.ToInt32(height * 0.26851851851851851851851851851852));
+ }
+ }
+ }
+ }
+
+ return wand;
+ }
+ }
+
+ private MagickWand BuildThumbCollageWand(IEnumerable<string> paths, int width, int height)
+ {
+ var inputPaths = ProjectPaths(paths, 8);
+ using (var wandImages = new MagickWand(inputPaths))
+ {
+ var wand = new MagickWand(width, height);
+ wand.OpenImage("gradient:#111111-#111111");
+ using (var draw = new DrawingWand())
+ {
+ var iSlice = Convert.ToInt32(width * .1166666667);
+ int iTrans = Convert.ToInt32(height * .25);
+ int iHeight = Convert.ToInt32(height * .6);
+ var horizontalImagePadding = Convert.ToInt32(width * 0.0125);
+
+ foreach (var element in wandImages.ImageList)
+ {
+ int iWidth = (int)Math.Abs(iHeight * element.Width / element.Height);
+ element.Gravity = GravityType.CenterGravity;
+ element.BackgroundColor = ColorName.Black;
+ element.ResizeImage(iWidth, iHeight, FilterTypes.LanczosFilter);
+ int ix = (int)Math.Abs((iWidth - iSlice) / 2);
+ element.CropImage(iSlice, iHeight, ix, 0);
+
+ element.ExtentImage(iSlice, iHeight, 0 - horizontalImagePadding, 0);
+ }
+
+ wandImages.SetFirstIterator();
+ using (var wandList = wandImages.AppendImages())
+ {
+ wandList.CurrentImage.TrimImage(1);
+ using (var mwr = wandList.CloneMagickWand())
+ {
+ mwr.CurrentImage.ResizeImage(wandList.CurrentImage.Width, (wandList.CurrentImage.Height / 2), FilterTypes.LanczosFilter, 1);
+ mwr.CurrentImage.FlipImage();
+
+ mwr.CurrentImage.AlphaChannel = AlphaChannelType.DeactivateAlphaChannel;
+ mwr.CurrentImage.ColorizeImage(ColorName.Black, ColorName.Grey60);
+
+ using (var mwg = new MagickWand(wandList.CurrentImage.Width, iTrans))
+ {
+ mwg.OpenImage("gradient:black-none");
+ var verticalSpacing = Convert.ToInt32(height * 0.01111111111111111111111111111111);
+ mwr.CurrentImage.CompositeImage(mwg, CompositeOperator.CopyOpacityCompositeOp, 0, verticalSpacing);
+
+ wandList.AddImage(mwr);
+ int ex = (int)(wand.CurrentImage.Width - mwg.CurrentImage.Width) / 2;
+ wand.CurrentImage.CompositeImage(wandList.AppendImages(true), CompositeOperator.AtopCompositeOp, ex, Convert.ToInt32(height * .1));
+ }
+ }
+ }
+ }
+
+ return wand;
+ }
+ }
+
+ private string MontserratLightFont
+ {
+ get { return PlayedIndicatorDrawer.ExtractFont("MontserratLight.otf", _appPaths); }
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/Playlists/PlaylistImageProvider.cs b/MediaBrowser.Server.Implementations/Playlists/PlaylistImageProvider.cs
index d009a03ae..81f9438b9 100644
--- a/MediaBrowser.Server.Implementations/Playlists/PlaylistImageProvider.cs
+++ b/MediaBrowser.Server.Implementations/Playlists/PlaylistImageProvider.cs
@@ -14,7 +14,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Server.Implementations.Playlists
{
- public class PlaylistImageProvider : BaseDynamicImageProvider<Playlist>, ICustomMetadataProvider<Playlist>
+ public class PlaylistImageProvider : BaseDynamicImageProvider<Playlist>
{
public PlaylistImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths) : base(fileSystem, providerManager, applicationPaths)
{
diff --git a/MediaBrowser.Server.Implementations/Sync/MediaSync.cs b/MediaBrowser.Server.Implementations/Sync/MediaSync.cs
index 8391dbd7a..48f682f98 100644
--- a/MediaBrowser.Server.Implementations/Sync/MediaSync.cs
+++ b/MediaBrowser.Server.Implementations/Sync/MediaSync.cs
@@ -152,7 +152,18 @@ namespace MediaBrowser.Server.Implementations.Sync
try
{
- await SendFile(provider, internalSyncJobItem.OutputPath, localItem, target, cancellationToken).ConfigureAwait(false);
+ var sendFileResult = await SendFile(provider, internalSyncJobItem.OutputPath, localItem, target, cancellationToken).ConfigureAwait(false);
+
+ if (localItem.Item.MediaSources != null)
+ {
+ var mediaSource = localItem.Item.MediaSources.FirstOrDefault();
+ if (mediaSource != null)
+ {
+ mediaSource.Path = sendFileResult.Path;
+ mediaSource.Protocol = sendFileResult.Protocol;
+ mediaSource.SupportsTranscoding = false;
+ }
+ }
// Create db record
await dataProvider.AddOrUpdate(target, localItem).ConfigureAwait(false);
@@ -203,11 +214,11 @@ namespace MediaBrowser.Server.Implementations.Sync
}
}
- private async Task SendFile(IServerSyncProvider provider, string inputPath, LocalItem item, SyncTarget target, CancellationToken cancellationToken)
+ private async Task<SendFileResult> SendFile(IServerSyncProvider provider, string inputPath, LocalItem item, SyncTarget target, CancellationToken cancellationToken)
{
using (var stream = _fileSystem.GetFileStream(inputPath, FileMode.Open, FileAccess.Read, FileShare.Read, true))
{
- await provider.SendFile(stream, item.LocalPath, target, new Progress<double>(), cancellationToken).ConfigureAwait(false);
+ return await provider.SendFile(stream, item.LocalPath, target, new Progress<double>(), cancellationToken).ConfigureAwait(false);
}
}
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs b/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs
index 2dbf8fc1b..8fb4b5a3a 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs
@@ -581,6 +581,8 @@ namespace MediaBrowser.Server.Implementations.Sync
jobItem.MediaSource = mediaSource;
}
+ jobItem.MediaSource.SupportsTranscoding = false;
+
if (externalSubs.Count > 0)
{
// Save the job item now since conversion could take a while
@@ -757,6 +759,8 @@ namespace MediaBrowser.Server.Implementations.Sync
jobItem.MediaSource = mediaSource;
}
+ jobItem.MediaSource.SupportsTranscoding = false;
+
jobItem.Progress = 50;
jobItem.Status = SyncJobItemStatus.ReadyToTransfer;
await _syncManager.UpdateSyncJobItemInternal(jobItem).ConfigureAwait(false);
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
index a974a7675..0bf9a2e23 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
@@ -136,6 +136,14 @@ namespace MediaBrowser.Server.Implementations.Sync
var jobId = Guid.NewGuid().ToString("N");
+ if (string.IsNullOrWhiteSpace(request.Quality))
+ {
+ request.Quality = GetQualityOptions(request.TargetId)
+ .Where(i => i.IsDefault)
+ .Select(i => i.Id)
+ .FirstOrDefault(i => !string.IsNullOrWhiteSpace(i));
+ }
+
var job = new SyncJob
{
Id = jobId,
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs
index 45b35523a..9d820eaa2 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs
@@ -50,7 +50,7 @@ namespace MediaBrowser.Server.Implementations.Sync
string[] queries = {
- "create table if not exists SyncJobs (Id GUID PRIMARY KEY, TargetId TEXT NOT NULL, Name TEXT NOT NULL, Quality TEXT NOT NULL, Status TEXT NOT NULL, Progress FLOAT, UserId TEXT NOT NULL, ItemIds TEXT NOT NULL, Category TEXT, ParentId TEXT, UnwatchedOnly BIT, ItemLimit INT, SyncNewContent BIT, DateCreated DateTime, DateLastModified DateTime, ItemCount int)",
+ "create table if not exists SyncJobs (Id GUID PRIMARY KEY, TargetId TEXT NOT NULL, Name TEXT NOT NULL, Quality TEXT, Status TEXT NOT NULL, Progress FLOAT, UserId TEXT NOT NULL, ItemIds TEXT NOT NULL, Category TEXT, ParentId TEXT, UnwatchedOnly BIT, ItemLimit INT, SyncNewContent BIT, DateCreated DateTime, DateLastModified DateTime, ItemCount int)",
"create index if not exists idx_SyncJobs on SyncJobs(Id)",
"create table if not exists SyncJobItems (Id GUID PRIMARY KEY, ItemId TEXT, ItemName TEXT, MediaSourceId TEXT, JobId TEXT, TemporaryPath TEXT, OutputPath TEXT, Status TEXT, TargetId TEXT, DateCreated DateTime, Progress FLOAT, AdditionalFiles TEXT, MediaSource TEXT, IsMarkedForRemoval BIT, JobItemIndex INT)",
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncedMediaSourceProvider.cs b/MediaBrowser.Server.Implementations/Sync/SyncedMediaSourceProvider.cs
index 0422e9791..93a466c52 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncedMediaSourceProvider.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncedMediaSourceProvider.cs
@@ -3,11 +3,9 @@ using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Sync;
using MediaBrowser.Model.Dto;
-using MediaBrowser.Model.MediaInfo;
using MediaBrowser.Model.Sync;
using System;
using System.Collections.Generic;
-using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
@@ -58,7 +56,7 @@ namespace MediaBrowser.Server.Implementations.Sync
foreach (var localItem in localItems)
{
- list.AddRange(GetPlayableMediaSources(localItem));
+ list.AddRange(localItem.Item.MediaSources);
}
}
}
@@ -66,24 +64,5 @@ namespace MediaBrowser.Server.Implementations.Sync
return list;
}
-
- private IEnumerable<MediaSourceInfo> GetPlayableMediaSources(LocalItem item)
- {
- return item.Item.MediaSources
- .Where(IsMediaSourcePlayable);
- }
-
- private bool IsMediaSourcePlayable(MediaSourceInfo mediaSource)
- {
- if (mediaSource.Protocol == MediaProtocol.File)
- {
- if (!File.Exists(mediaSource.Path))
- {
- return false;
- }
- }
-
- return true;
- }
}
}
diff --git a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs
index ec339fa42..a7de0fa34 100644
--- a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs
+++ b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs
@@ -197,6 +197,7 @@ namespace MediaBrowser.Server.Startup.Common
private ITVSeriesManager TVSeriesManager { get; set; }
private ICollectionManager CollectionManager { get; set; }
private IMediaSourceManager MediaSourceManager { get; set; }
+ private IPlaylistManager PlaylistManager { get; set; }
private readonly StartupOptions _startupOptions;
private readonly string _remotePackageName;
@@ -423,7 +424,7 @@ namespace MediaBrowser.Server.Startup.Common
LibraryMonitor = new LibraryMonitor(LogManager, TaskManager, LibraryManager, ServerConfigurationManager, FileSystemManager);
RegisterSingleInstance(LibraryMonitor);
- ProviderManager = new ProviderManager(HttpClient, ServerConfigurationManager, LibraryMonitor, LogManager, FileSystemManager, ApplicationPaths);
+ ProviderManager = new ProviderManager(HttpClient, ServerConfigurationManager, LibraryMonitor, LogManager, FileSystemManager, ApplicationPaths, () => LibraryManager);
RegisterSingleInstance(ProviderManager);
SeriesOrderManager = new SeriesOrderManager();
@@ -491,13 +492,13 @@ namespace MediaBrowser.Server.Startup.Common
CollectionManager = new CollectionManager(LibraryManager, FileSystemManager, LibraryMonitor, LogManager.GetLogger("CollectionManager"));
RegisterSingleInstance(CollectionManager);
- var playlistManager = new PlaylistManager(LibraryManager, FileSystemManager, LibraryMonitor, LogManager.GetLogger("PlaylistManager"), UserManager);
- RegisterSingleInstance<IPlaylistManager>(playlistManager);
+ PlaylistManager = new PlaylistManager(LibraryManager, FileSystemManager, LibraryMonitor, LogManager.GetLogger("PlaylistManager"), UserManager);
+ RegisterSingleInstance<IPlaylistManager>(PlaylistManager);
LiveTvManager = new LiveTvManager(this, ServerConfigurationManager, FileSystemManager, Logger, ItemRepository, ImageProcessor, UserDataManager, DtoService, UserManager, LibraryManager, TaskManager, LocalizationManager, JsonSerializer);
RegisterSingleInstance(LiveTvManager);
- UserViewManager = new UserViewManager(LibraryManager, LocalizationManager, UserManager, ChannelManager, LiveTvManager, playlistManager, CollectionManager, ServerConfigurationManager);
+ UserViewManager = new UserViewManager(LibraryManager, LocalizationManager, UserManager, ChannelManager, LiveTvManager, PlaylistManager, CollectionManager, ServerConfigurationManager);
RegisterSingleInstance(UserViewManager);
var contentDirectory = new ContentDirectory(dlnaManager, UserDataManager, ImageProcessor, LibraryManager, ServerConfigurationManager, UserManager, LogManager.GetLogger("UpnpContentDirectory"), HttpClient, LocalizationManager, ChannelManager, MediaSourceManager);
@@ -702,6 +703,7 @@ namespace MediaBrowser.Server.Startup.Common
BaseItem.LiveTvManager = LiveTvManager;
Folder.UserViewManager = UserViewManager;
UserView.TVSeriesManager = TVSeriesManager;
+ UserView.PlaylistManager = PlaylistManager;
BaseItem.CollectionManager = CollectionManager;
BaseItem.MediaSourceManager = MediaSourceManager;
}
diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec
index 757a2c44c..6b4ad7db7 100644
--- a/Nuget/MediaBrowser.Common.Internal.nuspec
+++ b/Nuget/MediaBrowser.Common.Internal.nuspec
@@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>MediaBrowser.Common.Internal</id>
- <version>3.0.584</version>
+ <version>3.0.587</version>
<title>MediaBrowser.Common.Internal</title>
<authors>Luke</authors>
<owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
<description>Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption.</description>
<copyright>Copyright © Media Browser 2013</copyright>
<dependencies>
- <dependency id="MediaBrowser.Common" version="3.0.584" />
+ <dependency id="MediaBrowser.Common" version="3.0.587" />
<dependency id="NLog" version="3.2.0.0" />
<dependency id="SimpleInjector" version="2.7.0" />
</dependencies>
diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec
index f70af82b5..0ea9e9aa9 100644
--- a/Nuget/MediaBrowser.Common.nuspec
+++ b/Nuget/MediaBrowser.Common.nuspec
@@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>MediaBrowser.Common</id>
- <version>3.0.584</version>
+ <version>3.0.587</version>
<title>MediaBrowser.Common</title>
<authors>Media Browser Team</authors>
<owners>ebr,Luke,scottisafool</owners>
diff --git a/Nuget/MediaBrowser.Model.Signed.nuspec b/Nuget/MediaBrowser.Model.Signed.nuspec
index 13a9c8f62..d77f0fc06 100644
--- a/Nuget/MediaBrowser.Model.Signed.nuspec
+++ b/Nuget/MediaBrowser.Model.Signed.nuspec
@@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>MediaBrowser.Model.Signed</id>
- <version>3.0.584</version>
+ <version>3.0.587</version>
<title>MediaBrowser.Model - Signed Edition</title>
<authors>Media Browser Team</authors>
<owners>ebr,Luke,scottisafool</owners>
diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec
index 9cad3b441..9a1a7d068 100644
--- a/Nuget/MediaBrowser.Server.Core.nuspec
+++ b/Nuget/MediaBrowser.Server.Core.nuspec
@@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>MediaBrowser.Server.Core</id>
- <version>3.0.584</version>
+ <version>3.0.587</version>
<title>Media Browser.Server.Core</title>
<authors>Media Browser Team</authors>
<owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
<description>Contains core components required to build plugins for Media Browser Server.</description>
<copyright>Copyright © Media Browser 2013</copyright>
<dependencies>
- <dependency id="MediaBrowser.Common" version="3.0.584" />
+ <dependency id="MediaBrowser.Common" version="3.0.587" />
</dependencies>
</metadata>
<files>