aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations
diff options
context:
space:
mode:
authorLuke <luke.pulverenti@gmail.com>2016-03-19 16:23:33 -0400
committerLuke <luke.pulverenti@gmail.com>2016-03-19 16:23:33 -0400
commit3ab212d070384c0a0000e255307aa58d15cbd0ae (patch)
tree6ca899cd7be8685771b56b0074c5b3022faa789a /MediaBrowser.Server.Implementations
parentfd0d50ad978801164728f7f6bd067430aa090c5f (diff)
parentdb1bf5b1b55c8012e9ca3393fd59b9469ee5aeaf (diff)
Merge pull request #1563 from MediaBrowser/dev
Dev
Diffstat (limited to 'MediaBrowser.Server.Implementations')
-rw-r--r--MediaBrowser.Server.Implementations/Channels/ChannelDynamicMediaSourceProvider.cs6
-rw-r--r--MediaBrowser.Server.Implementations/Channels/ChannelManager.cs132
-rw-r--r--MediaBrowser.Server.Implementations/Dto/DtoService.cs25
-rw-r--r--MediaBrowser.Server.Implementations/EntryPoints/ActivityLogEntryPoint.cs4
-rw-r--r--MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs2
-rw-r--r--MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifications.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs90
-rw-r--r--MediaBrowser.Server.Implementations/Library/LibraryManager.cs47
-rw-r--r--MediaBrowser.Server.Implementations/Library/LocalTrailerPostScanTask.cs14
-rw-r--r--MediaBrowser.Server.Implementations/Library/Resolvers/VideoResolver.cs8
-rw-r--r--MediaBrowser.Server.Implementations/Library/UserViewManager.cs11
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs89
-rw-r--r--MediaBrowser.Server.Implementations/Sync/SyncManager.cs2
14 files changed, 294 insertions, 140 deletions
diff --git a/MediaBrowser.Server.Implementations/Channels/ChannelDynamicMediaSourceProvider.cs b/MediaBrowser.Server.Implementations/Channels/ChannelDynamicMediaSourceProvider.cs
index dac3a80f2..3239b20b2 100644
--- a/MediaBrowser.Server.Implementations/Channels/ChannelDynamicMediaSourceProvider.cs
+++ b/MediaBrowser.Server.Implementations/Channels/ChannelDynamicMediaSourceProvider.cs
@@ -20,11 +20,11 @@ namespace MediaBrowser.Server.Implementations.Channels
public Task<IEnumerable<MediaSourceInfo>> GetMediaSources(IHasMediaSources item, CancellationToken cancellationToken)
{
- var channelItem = item as IChannelMediaItem;
+ var baseItem = (BaseItem) item;
- if (channelItem != null)
+ if (baseItem.SourceType == SourceType.Channel)
{
- return _channelManager.GetDynamicMediaSources(channelItem, cancellationToken);
+ return _channelManager.GetDynamicMediaSources(baseItem, cancellationToken);
}
return Task.FromResult<IEnumerable<MediaSourceInfo>>(new List<MediaSourceInfo>());
diff --git a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs
index c7865b6aa..e957b9889 100644
--- a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs
+++ b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs
@@ -26,6 +26,9 @@ using System.Net;
using System.Threading;
using System.Threading.Tasks;
using CommonIO;
+using MediaBrowser.Controller.Entities.Audio;
+using MediaBrowser.Controller.Entities.Movies;
+using MediaBrowser.Controller.Entities.TV;
namespace MediaBrowser.Server.Implementations.Channels
{
@@ -248,9 +251,19 @@ namespace MediaBrowser.Server.Implementations.Channels
return item;
}
- public async Task<IEnumerable<MediaSourceInfo>> GetStaticMediaSources(IChannelMediaItem item, bool includeCachedVersions, CancellationToken cancellationToken)
+ public async Task<IEnumerable<MediaSourceInfo>> GetStaticMediaSources(BaseItem item, bool includeCachedVersions, CancellationToken cancellationToken)
{
- IEnumerable<ChannelMediaInfo> results = item.ChannelMediaSources;
+ IEnumerable<ChannelMediaInfo> results = new List<ChannelMediaInfo>();
+ var video = item as Video;
+ if (video != null)
+ {
+ results = video.ChannelMediaSources;
+ }
+ var audio = item as Audio;
+ if (audio != null)
+ {
+ results = audio.ChannelMediaSources ?? new List<ChannelMediaInfo>();
+ }
var sources = SortMediaInfoResults(results)
.Select(i => GetMediaSource(item, i))
@@ -265,7 +278,7 @@ namespace MediaBrowser.Server.Implementations.Channels
return sources;
}
- public async Task<IEnumerable<MediaSourceInfo>> GetDynamicMediaSources(IChannelMediaItem item, CancellationToken cancellationToken)
+ public async Task<IEnumerable<MediaSourceInfo>> GetDynamicMediaSources(BaseItem item, CancellationToken cancellationToken)
{
var channel = GetChannel(item.ChannelId);
var channelPlugin = GetChannelProvider(channel);
@@ -319,7 +332,7 @@ namespace MediaBrowser.Server.Implementations.Channels
return list;
}
- private IEnumerable<MediaSourceInfo> GetCachedChannelItemMediaSources(IChannelMediaItem item)
+ private IEnumerable<MediaSourceInfo> GetCachedChannelItemMediaSources(BaseItem item)
{
var filenamePrefix = item.Id.ToString("N");
var parentPath = Path.Combine(ChannelDownloadPath, item.ChannelId);
@@ -368,7 +381,7 @@ namespace MediaBrowser.Server.Implementations.Channels
return new List<MediaSourceInfo>();
}
- private MediaSourceInfo GetMediaSource(IChannelMediaItem item, ChannelMediaInfo info)
+ private MediaSourceInfo GetMediaSource(BaseItem item, ChannelMediaInfo info)
{
var source = info.ToMediaSource();
@@ -411,6 +424,7 @@ namespace MediaBrowser.Server.Implementations.Channels
var parentFolderId = parentFolder.Id;
var id = GetInternalChannelId(channelInfo.Name);
+ var idString = id.ToString("N");
var path = Channel.GetInternalMetadataPath(_config.ApplicationPaths.InternalMetadataPath, id);
@@ -418,7 +432,6 @@ namespace MediaBrowser.Server.Implementations.Channels
var forceUpdate = false;
var item = _libraryManager.GetItemById(id) as Channel;
- var channelId = channelInfo.Name.GetMD5().ToString("N");
if (item == null)
{
@@ -439,11 +452,11 @@ namespace MediaBrowser.Server.Implementations.Channels
}
item.Path = path;
- if (!string.Equals(item.ChannelId, channelId, StringComparison.OrdinalIgnoreCase))
+ if (!string.Equals(item.ChannelId, idString, StringComparison.OrdinalIgnoreCase))
{
forceUpdate = true;
}
- item.ChannelId = channelId;
+ item.ChannelId = idString;
if (item.ParentId != parentFolderId)
{
@@ -492,7 +505,7 @@ namespace MediaBrowser.Server.Implementations.Channels
public Channel GetChannel(string id)
{
- return _libraryManager.GetItemById(new Guid(id)) as Channel;
+ return _libraryManager.GetItemById(id) as Channel;
}
public IEnumerable<ChannelFeatures> GetAllChannelFeatures()
@@ -510,6 +523,11 @@ namespace MediaBrowser.Server.Implementations.Channels
public ChannelFeatures GetChannelFeatures(string id)
{
+ if (string.IsNullOrWhiteSpace(id))
+ {
+ throw new ArgumentNullException("id");
+ }
+
var channel = GetChannel(id);
var channelProvider = GetChannelProvider(channel);
@@ -1079,7 +1097,7 @@ namespace MediaBrowser.Server.Implementations.Channels
if (!string.IsNullOrWhiteSpace(folderId))
{
- var categoryItem = (IChannelItem)_libraryManager.GetItemById(new Guid(folderId));
+ var categoryItem = _libraryManager.GetItemById(new Guid(folderId));
query.FolderId = categoryItem.ExternalId;
}
@@ -1195,7 +1213,7 @@ namespace MediaBrowser.Server.Implementations.Channels
}
private T GetItemById<T>(string idString, string channelName, string channnelDataVersion, out bool isNew)
- where T : BaseItem, IChannelItem, new()
+ where T : BaseItem, new()
{
var id = GetIdToHash(idString, channelName).GetMBId(typeof(T));
@@ -1233,15 +1251,48 @@ namespace MediaBrowser.Server.Implementations.Channels
if (info.Type == ChannelItemType.Folder)
{
- item = GetItemById<ChannelFolderItem>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew);
+ if (info.FolderType == ChannelFolderType.MusicAlbum)
+ {
+ item = GetItemById<MusicAlbum>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew);
+ }
+ else if (info.FolderType == ChannelFolderType.PhotoAlbum)
+ {
+ item = GetItemById<PhotoAlbum>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew);
+ }
+ else
+ {
+ item = GetItemById<Folder>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew);
+ }
}
else if (info.MediaType == ChannelMediaType.Audio)
{
- item = GetItemById<ChannelAudioItem>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew);
+ if (info.ContentType == ChannelMediaContentType.Podcast)
+ {
+ item = GetItemById<AudioPodcast>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew);
+ }
+ else
+ {
+ item = GetItemById<Audio>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew);
+ }
}
else
{
- item = GetItemById<ChannelVideoItem>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew);
+ if (info.ContentType == ChannelMediaContentType.Episode)
+ {
+ item = GetItemById<Episode>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew);
+ }
+ else if (info.ContentType == ChannelMediaContentType.Movie)
+ {
+ item = GetItemById<Movie>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew);
+ }
+ else if (info.ContentType == ChannelMediaContentType.Trailer || info.ExtraType == ExtraType.Trailer)
+ {
+ item = GetItemById<Trailer>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew);
+ }
+ else
+ {
+ item = GetItemById<Video>(info.Id, channelProvider.Name, channelProvider.DataVersion, out isNew);
+ }
}
item.RunTimeTicks = info.RunTimeTicks;
@@ -1263,9 +1314,17 @@ namespace MediaBrowser.Server.Implementations.Channels
item.Tags = info.Tags;
}
- var channelItem = (IChannelItem)item;
+ var trailer = item as Trailer;
+ if (trailer != null)
+ {
+ if (!info.TrailerTypes.SequenceEqual(trailer.TrailerTypes))
+ {
+ forceUpdate = true;
+ }
+ trailer.TrailerTypes = info.TrailerTypes;
+ }
- channelItem.ChannelId = internalChannelId.ToString("N");
+ item.ChannelId = internalChannelId.ToString("N");
if (item.ParentId != internalChannelId)
{
@@ -1273,22 +1332,29 @@ namespace MediaBrowser.Server.Implementations.Channels
}
item.ParentId = internalChannelId;
- if (!string.Equals(channelItem.ExternalId, info.Id, StringComparison.OrdinalIgnoreCase))
+ if (!string.Equals(item.ExternalId, info.Id, StringComparison.OrdinalIgnoreCase))
{
forceUpdate = true;
}
- channelItem.ExternalId = info.Id;
+ item.ExternalId = info.Id;
- var channelMediaItem = item as IChannelMediaItem;
-
- if (channelMediaItem != null)
+ var channelAudioItem = item as Audio;
+ if (channelAudioItem != null)
{
- channelMediaItem.ContentType = info.ContentType;
- channelMediaItem.ExtraType = info.ExtraType;
- channelMediaItem.ChannelMediaSources = info.MediaSources;
+ channelAudioItem.ExtraType = info.ExtraType;
+ channelAudioItem.ChannelMediaSources = info.MediaSources;
var mediaSource = info.MediaSources.FirstOrDefault();
+ item.Path = mediaSource == null ? null : mediaSource.Path;
+ }
+
+ var channelVideoItem = item as Video;
+ if (channelVideoItem != null)
+ {
+ channelVideoItem.ExtraType = info.ExtraType;
+ channelVideoItem.ChannelMediaSources = info.MediaSources;
+ var mediaSource = info.MediaSources.FirstOrDefault();
item.Path = mediaSource == null ? null : mediaSource.Path;
}
@@ -1297,6 +1363,12 @@ namespace MediaBrowser.Server.Implementations.Channels
item.SetImagePath(ImageType.Primary, info.ImageUrl);
}
+ if (item.SourceType != SourceType.Channel)
+ {
+ item.SourceType = SourceType.Channel;
+ forceUpdate = true;
+ }
+
if (isNew)
{
await _libraryManager.CreateItem(item, cancellationToken).ConfigureAwait(false);
@@ -1334,7 +1406,12 @@ namespace MediaBrowser.Server.Implementations.Channels
internal IChannel GetChannelProvider(Channel channel)
{
- var result = GetAllChannels().FirstOrDefault(i => string.Equals(i.Name.GetMD5().ToString("N"), channel.ChannelId, StringComparison.OrdinalIgnoreCase) || string.Equals(i.Name, channel.Name, StringComparison.OrdinalIgnoreCase));
+ if (channel == null)
+ {
+ throw new ArgumentNullException("channel");
+ }
+
+ var result = GetAllChannels().FirstOrDefault(i => string.Equals(GetInternalChannelId(i.Name).ToString("N"), channel.ChannelId, StringComparison.OrdinalIgnoreCase) || string.Equals(i.Name, channel.Name, StringComparison.OrdinalIgnoreCase));
if (result == null)
{
@@ -1441,7 +1518,7 @@ namespace MediaBrowser.Server.Implementations.Channels
return await _libraryManager.GetNamedView(name, "channels", "zz_" + name, cancellationToken).ConfigureAwait(false);
}
- public async Task DownloadChannelItem(IChannelMediaItem item, string destination,
+ public async Task DownloadChannelItem(BaseItem item, string destination,
IProgress<double> progress, CancellationToken cancellationToken)
{
var sources = await GetDynamicMediaSources(item, cancellationToken)
@@ -1457,7 +1534,7 @@ namespace MediaBrowser.Server.Implementations.Channels
}
private async Task TryDownloadChannelItem(MediaSourceInfo source,
- IChannelMediaItem item,
+ BaseItem item,
string destination,
IProgress<double> progress,
CancellationToken cancellationToken)
@@ -1469,7 +1546,6 @@ namespace MediaBrowser.Server.Implementations.Channels
Progress = new Progress<double>()
};
- var host = new Uri(source.Path).Host.ToLower();
var channel = GetChannel(item.ChannelId);
var channelProvider = GetChannelProvider(channel);
var features = channelProvider.GetChannelFeatures();
diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs
index fb202b798..3b63eccfc 100644
--- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs
+++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs
@@ -316,6 +316,11 @@ namespace MediaBrowser.Server.Implementations.Dto
ServerId = _appHost.SystemId
};
+ if (item.SourceType == SourceType.Channel)
+ {
+ dto.SourceType = item.SourceType.ToString();
+ }
+
if (fields.Contains(ItemFields.People))
{
AttachPeople(dto, item);
@@ -480,7 +485,7 @@ namespace MediaBrowser.Server.Implementations.Dto
var folder = (Folder)item;
- if (!(folder is IChannelItem) && !(folder is Channel))
+ if (item.SourceType == SourceType.Library)
{
dto.ChildCount = GetChildCount(folder, user);
@@ -1250,6 +1255,7 @@ namespace MediaBrowser.Server.Implementations.Dto
if (audio != null)
{
dto.Album = audio.Album;
+ dto.ExtraType = audio.ExtraType;
var albumParent = audio.AlbumEntity;
@@ -1352,6 +1358,8 @@ namespace MediaBrowser.Server.Implementations.Dto
{
dto.Chapters = GetChapterInfoDtos(item);
}
+
+ dto.ExtraType = video.ExtraType;
}
if (fields.Contains(ItemFields.MediaStreams))
@@ -1531,16 +1539,13 @@ namespace MediaBrowser.Server.Implementations.Dto
dto.ChannelId = item.ChannelId;
- var channelItem = item as IChannelItem;
- if (channelItem != null)
+ if (item.SourceType == SourceType.Channel && !string.IsNullOrWhiteSpace(item.ChannelId))
{
- dto.ChannelName = _channelManagerFactory().GetChannel(channelItem.ChannelId).Name;
- }
-
- var channelMediaItem = item as IChannelMediaItem;
- if (channelMediaItem != null)
- {
- dto.ExtraType = channelMediaItem.ExtraType;
+ var channel = _libraryManager.GetItemById(item.ChannelId);
+ if (channel != null)
+ {
+ dto.ChannelName = channel.Name;
+ }
}
}
diff --git a/MediaBrowser.Server.Implementations/EntryPoints/ActivityLogEntryPoint.cs b/MediaBrowser.Server.Implementations/EntryPoints/ActivityLogEntryPoint.cs
index 28883e9a2..dfaedbc9d 100644
--- a/MediaBrowser.Server.Implementations/EntryPoints/ActivityLogEntryPoint.cs
+++ b/MediaBrowser.Server.Implementations/EntryPoints/ActivityLogEntryPoint.cs
@@ -342,7 +342,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
void _libraryManager_ItemRemoved(object sender, ItemChangeEventArgs e)
{
- if (e.Item is LiveTvProgram || e.Item is IChannelItem)
+ if (e.Item.SourceType != SourceType.Library)
{
return;
}
@@ -356,7 +356,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
void _libraryManager_ItemAdded(object sender, ItemChangeEventArgs e)
{
- if (e.Item is LiveTvProgram || e.Item is IChannelItem)
+ if (e.Item.SourceType != SourceType.Library)
{
return;
}
diff --git a/MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs b/MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs
index 703096a2b..237c7157b 100644
--- a/MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs
+++ b/MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs
@@ -282,7 +282,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
return false;
}
- return !(item is IChannelItem) && !(item is ILiveTvItem);
+ return item.SourceType == SourceType.Library;
}
/// <summary>
diff --git a/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifications.cs b/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifications.cs
index a9e4aaa0b..da1d25f2c 100644
--- a/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifications.cs
+++ b/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifications.cs
@@ -346,7 +346,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications
return false;
}
- return !(item is IChannelItem) && !(item is ILiveTvItem);
+ return item.SourceType == SourceType.Library;
}
private async void LibraryUpdateTimerCallback(object state)
diff --git a/MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs b/MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs
index 5b72860b6..5adddd38a 100644
--- a/MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs
+++ b/MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs
@@ -24,17 +24,15 @@ namespace MediaBrowser.Server.Implementations.Intros
public class DefaultIntroProvider : IIntroProvider
{
private readonly ISecurityManager _security;
- private readonly IChannelManager _channelManager;
private readonly ILocalizationManager _localization;
private readonly IConfigurationManager _serverConfig;
private readonly ILibraryManager _libraryManager;
private readonly IFileSystem _fileSystem;
private readonly IMediaSourceManager _mediaSourceManager;
- public DefaultIntroProvider(ISecurityManager security, IChannelManager channelManager, ILocalizationManager localization, IConfigurationManager serverConfig, ILibraryManager libraryManager, IFileSystem fileSystem, IMediaSourceManager mediaSourceManager)
+ public DefaultIntroProvider(ISecurityManager security, ILocalizationManager localization, IConfigurationManager serverConfig, ILibraryManager libraryManager, IFileSystem fileSystem, IMediaSourceManager mediaSourceManager)
{
_security = security;
- _channelManager = channelManager;
_localization = localization;
_serverConfig = serverConfig;
_libraryManager = libraryManager;
@@ -79,76 +77,45 @@ namespace MediaBrowser.Server.Implementations.Intros
AppearsInItemId = item.Id
});
- if (config.EnableIntrosFromMoviesInLibrary)
- {
- var inputItems = _libraryManager.GetItems(new InternalItemsQuery(user)
- {
- IncludeItemTypes = new[] { typeof(Movie).Name }
-
- }, new string[] { });
-
- var itemsWithTrailers = inputItems
- .Where(i =>
- {
- var hasTrailers = i as IHasTrailers;
-
- if (hasTrailers != null && hasTrailers.LocalTrailerIds.Count > 0)
- {
- if (i is Movie)
- {
- return !IsDuplicate(item, i);
- }
- }
- return false;
- });
-
- candidates.AddRange(itemsWithTrailers.Select(i => new ItemWithTrailer
- {
- Item = i,
- Type = ItemWithTrailerType.ItemWithTrailer,
- User = user,
- WatchingItem = item,
- WatchingItemPeople = itemPeople,
- AllPeople = allPeople,
- Random = random,
- LibraryManager = _libraryManager
- }));
- }
-
var trailerTypes = new List<TrailerType>();
- if (config.EnableIntrosFromUpcomingTrailers)
- {
- trailerTypes.Add(TrailerType.ComingSoonToTheaters);
- }
- if (config.EnableIntrosFromUpcomingDvdMovies)
- {
- trailerTypes.Add(TrailerType.ComingSoonToDvd);
- }
- if (config.EnableIntrosFromUpcomingStreamingMovies)
+ if (config.EnableIntrosFromMoviesInLibrary)
{
- trailerTypes.Add(TrailerType.ComingSoonToStreaming);
+ trailerTypes.Add(TrailerType.LocalTrailer);
}
- if (config.EnableIntrosFromSimilarMovies)
+
+ if (IsSupporter)
{
- trailerTypes.Add(TrailerType.Archive);
+ if (config.EnableIntrosFromUpcomingTrailers)
+ {
+ trailerTypes.Add(TrailerType.ComingSoonToTheaters);
+ }
+ if (config.EnableIntrosFromUpcomingDvdMovies)
+ {
+ trailerTypes.Add(TrailerType.ComingSoonToDvd);
+ }
+ if (config.EnableIntrosFromUpcomingStreamingMovies)
+ {
+ trailerTypes.Add(TrailerType.ComingSoonToStreaming);
+ }
+ if (config.EnableIntrosFromSimilarMovies)
+ {
+ trailerTypes.Add(TrailerType.Archive);
+ }
}
- if (trailerTypes.Count > 0 && IsSupporter)
+ if (trailerTypes.Count > 0)
{
- var channelTrailers = await _channelManager.GetAllMediaInternal(new AllChannelMediaQuery
+ var trailerResult = _libraryManager.GetItems(new InternalItemsQuery
{
- ContentTypes = new[] { ChannelMediaContentType.MovieExtra },
- ExtraTypes = new[] { ExtraType.Trailer },
- UserId = user.Id.ToString("N"),
+ IncludeItemTypes = new[] { typeof(Trailer).Name },
TrailerTypes = trailerTypes.ToArray()
+ });
- }, CancellationToken.None);
-
- candidates.AddRange(channelTrailers.Items.Select(i => new ItemWithTrailer
+ candidates.AddRange(trailerResult.Items.Select(i => new ItemWithTrailer
{
Item = i,
- Type = ItemWithTrailerType.ChannelTrailer,
+ Type = i.SourceType == SourceType.Channel ? ItemWithTrailerType.ChannelTrailer : ItemWithTrailerType.ItemWithTrailer,
User = user,
WatchingItem = item,
WatchingItemPeople = itemPeople,
@@ -156,7 +123,7 @@ namespace MediaBrowser.Server.Implementations.Intros
Random = random,
LibraryManager = _libraryManager
}));
- }
+ }
return GetResult(item, candidates, config, ratingLevel);
}
@@ -556,7 +523,6 @@ namespace MediaBrowser.Server.Implementations.Intros
internal enum ItemWithTrailerType
{
- LibraryTrailer,
ChannelTrailer,
ItemWithTrailer
}
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
index 3c56af9e6..19b66836b 100644
--- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
@@ -40,8 +40,10 @@ using CommonIO;
using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.Library;
using MediaBrowser.Model.Net;
+using MediaBrowser.Server.Implementations.Library.Resolvers;
using MoreLinq;
using SortOrder = MediaBrowser.Model.Entities.SortOrder;
+using VideoResolver = MediaBrowser.Naming.Video.VideoResolver;
namespace MediaBrowser.Server.Implementations.Library
{
@@ -347,11 +349,7 @@ namespace MediaBrowser.Server.Implementations.Library
private void RegisterItem(Guid id, BaseItem item)
{
- if (item is LiveTvProgram)
- {
- return;
- }
- if (item is IChannelItem)
+ if (item.SourceType != SourceType.Library)
{
return;
}
@@ -458,10 +456,11 @@ namespace MediaBrowser.Server.Implementations.Library
/// Resolves the item.
/// </summary>
/// <param name="args">The args.</param>
+ /// <param name="resolvers">The resolvers.</param>
/// <returns>BaseItem.</returns>
- private BaseItem ResolveItem(ItemResolveArgs args)
+ private BaseItem ResolveItem(ItemResolveArgs args, IItemResolver[] resolvers)
{
- var item = EntityResolvers.Select(r => Resolve(args, r))
+ var item = (resolvers ?? EntityResolvers).Select(r => Resolve(args, r))
.FirstOrDefault(i => i != null);
if (item != null)
@@ -560,10 +559,10 @@ namespace MediaBrowser.Server.Implementations.Library
public BaseItem ResolvePath(FileSystemMetadata fileInfo,
Folder parent = null)
{
- return ResolvePath(fileInfo, new DirectoryService(_logger, _fileSystem), parent);
+ return ResolvePath(fileInfo, new DirectoryService(_logger, _fileSystem), null, parent);
}
- private BaseItem ResolvePath(FileSystemMetadata fileInfo, IDirectoryService directoryService, Folder parent = null, string collectionType = null)
+ private BaseItem ResolvePath(FileSystemMetadata fileInfo, IDirectoryService directoryService, IItemResolver[] resolvers, Folder parent = null, string collectionType = null)
{
if (fileInfo == null)
{
@@ -619,7 +618,7 @@ namespace MediaBrowser.Server.Implementations.Library
return null;
}
- return ResolveItem(args);
+ return ResolveItem(args, resolvers);
}
public bool IgnoreFile(FileSystemMetadata file, BaseItem parent)
@@ -662,11 +661,18 @@ namespace MediaBrowser.Server.Implementations.Library
public IEnumerable<BaseItem> ResolvePaths(IEnumerable<FileSystemMetadata> files, IDirectoryService directoryService, Folder parent, string collectionType)
{
+ return ResolvePaths(files, directoryService, parent, collectionType, EntityResolvers);
+ }
+
+ public IEnumerable<BaseItem> ResolvePaths(IEnumerable<FileSystemMetadata> files, IDirectoryService directoryService, Folder parent, string collectionType, IItemResolver[] resolvers)
+ {
var fileList = files.Where(i => !IgnoreFile(i, parent)).ToList();
if (parent != null)
{
- foreach (var resolver in MultiItemResolvers)
+ var multiItemResolvers = resolvers == null ? MultiItemResolvers : resolvers.OfType<IMultiItemResolver>().ToArray();
+
+ foreach (var resolver in multiItemResolvers)
{
var result = resolver.ResolveMultiple(parent, fileList, collectionType, directoryService);
@@ -679,22 +685,22 @@ namespace MediaBrowser.Server.Implementations.Library
{
ResolverHelper.SetInitialItemValues(item, parent, _fileSystem, this, directoryService);
}
- items.AddRange(ResolveFileList(result.ExtraFiles, directoryService, parent, collectionType));
+ items.AddRange(ResolveFileList(result.ExtraFiles, directoryService, parent, collectionType, resolvers));
return items;
}
}
}
- return ResolveFileList(fileList, directoryService, parent, collectionType);
+ return ResolveFileList(fileList, directoryService, parent, collectionType, resolvers);
}
- private IEnumerable<BaseItem> ResolveFileList(IEnumerable<FileSystemMetadata> fileList, IDirectoryService directoryService, Folder parent, string collectionType)
+ private IEnumerable<BaseItem> ResolveFileList(IEnumerable<FileSystemMetadata> fileList, IDirectoryService directoryService, Folder parent, string collectionType, IItemResolver[] resolvers)
{
return fileList.Select(f =>
{
try
{
- return ResolvePath(f, directoryService, parent, collectionType);
+ return ResolvePath(f, directoryService, resolvers, parent, collectionType);
}
catch (Exception ex)
{
@@ -2310,12 +2316,17 @@ namespace MediaBrowser.Server.Implementations.Library
files.AddRange(currentVideo.Extras.Where(i => string.Equals(i.ExtraType, "trailer", StringComparison.OrdinalIgnoreCase)).Select(i => _fileSystem.GetFileInfo(i.Path)));
}
- return ResolvePaths(files, directoryService, null, null)
- .OfType<Video>()
+ var resolvers = new IItemResolver[]
+ {
+ new GenericVideoResolver<Trailer>(this)
+ };
+
+ return ResolvePaths(files, directoryService, null, null, resolvers)
+ .OfType<Trailer>()
.Select(video =>
{
// Try to retrieve it from the db. If we don't find it, use the resolved version
- var dbItem = GetItemById(video.Id) as Video;
+ var dbItem = GetItemById(video.Id) as Trailer;
if (dbItem != null)
{
diff --git a/MediaBrowser.Server.Implementations/Library/LocalTrailerPostScanTask.cs b/MediaBrowser.Server.Implementations/Library/LocalTrailerPostScanTask.cs
index b72406730..10263f7d7 100644
--- a/MediaBrowser.Server.Implementations/Library/LocalTrailerPostScanTask.cs
+++ b/MediaBrowser.Server.Implementations/Library/LocalTrailerPostScanTask.cs
@@ -28,12 +28,16 @@ namespace MediaBrowser.Server.Implementations.Library
.Cast<IHasTrailers>()
.ToList();
- var channelTrailerResult = await _channelManager.GetAllMediaInternal(new AllChannelMediaQuery
+ var trailerResult = _libraryManager.GetItems(new InternalItemsQuery
{
- ExtraTypes = new[] { ExtraType.Trailer }
+ IncludeItemTypes = new[] { typeof(Trailer).Name },
+ ExcludeTrailerTypes = new[]
+ {
+ TrailerType.LocalTrailer
+ }
- }, CancellationToken.None);
- var channelTrailers = channelTrailerResult.Items;
+ });
+ var trailers = trailerResult.Items;
var numComplete = 0;
@@ -41,7 +45,7 @@ namespace MediaBrowser.Server.Implementations.Library
{
cancellationToken.ThrowIfCancellationRequested();
- await AssignTrailers(item, channelTrailers).ConfigureAwait(false);
+ await AssignTrailers(item, trailers).ConfigureAwait(false);
numComplete++;
double percent = numComplete;
diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/VideoResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/VideoResolver.cs
index 97682db66..c7f21cef1 100644
--- a/MediaBrowser.Server.Implementations/Library/Resolvers/VideoResolver.cs
+++ b/MediaBrowser.Server.Implementations/Library/Resolvers/VideoResolver.cs
@@ -34,4 +34,12 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers
get { return ResolverPriority.Last; }
}
}
+
+ public class GenericVideoResolver<T> : BaseVideoResolver<T>
+ where T : Video, new ()
+ {
+ public GenericVideoResolver(ILibraryManager libraryManager) : base(libraryManager)
+ {
+ }
+ }
}
diff --git a/MediaBrowser.Server.Implementations/Library/UserViewManager.cs b/MediaBrowser.Server.Implementations/Library/UserViewManager.cs
index a375dde31..9d276ada2 100644
--- a/MediaBrowser.Server.Implementations/Library/UserViewManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/UserViewManager.cs
@@ -80,7 +80,7 @@ namespace MediaBrowser.Server.Implementations.Library
list.Add(folder);
continue;
}
-
+
if (collectionFolder != null && UserView.IsEligibleForGrouping(folder) && user.IsFolderGrouped(folder.Id))
{
groupedFolders.Add(collectionFolder);
@@ -272,7 +272,11 @@ namespace MediaBrowser.Server.Implementations.Library
.ToArray();
}
- var excludeItemTypes = includeItemTypes.Length == 0 ? new[] { "ChannelItem", "LiveTvItem", typeof(Person).Name, typeof(Studio).Name, typeof(Year).Name, typeof(GameGenre).Name, typeof(MusicGenre).Name, typeof(Genre).Name } : new string[] { };
+ var excludeItemTypes = includeItemTypes.Length == 0 ? new[]
+ {
+ typeof(Person).Name, typeof(Studio).Name, typeof(Year).Name, typeof(GameGenre).Name, typeof(MusicGenre).Name, typeof(Genre).Name
+
+ } : new string[] { };
return _libraryManager.GetItems(new InternalItemsQuery(user)
{
@@ -282,7 +286,8 @@ namespace MediaBrowser.Server.Implementations.Library
IsFolder = includeItemTypes.Length == 0 ? false : (bool?)null,
ExcludeItemTypes = excludeItemTypes,
ExcludeLocationTypes = new[] { LocationType.Virtual },
- Limit = limit * 20
+ Limit = limit * 20,
+ ExcludeSourceTypes = parentIds.Length == 0 ? new[] { SourceType.Channel, SourceType.LiveTV } : new SourceType[] { }
}, parentIds);
}
diff --git a/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs b/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs
index f8f003fa1..ffe95c862 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs
@@ -68,7 +68,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts
extInf = line.Substring(8).Trim();
_logger.Info("Found m3u channel: {0}", extInf);
}
- else if (!string.IsNullOrWhiteSpace(extInf))
+ else if (!string.IsNullOrWhiteSpace(extInf) && !line.StartsWith("#", StringComparison.OrdinalIgnoreCase))
{
var channel = GetChannelnfo(extInf, tunerHostId);
channel.Id = channelIdPrefix + urlHash + line.GetMD5().ToString("N");
diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
index 56daff78a..3f50278f6 100644
--- a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
+++ b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
@@ -223,6 +223,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
_connection.AddColumn(Logger, "TypedBaseItems", "UnratedType", "Text");
_connection.AddColumn(Logger, "TypedBaseItems", "TopParentId", "Text");
_connection.AddColumn(Logger, "TypedBaseItems", "IsItemByName", "BIT");
+ _connection.AddColumn(Logger, "TypedBaseItems", "SourceType", "Text");
+ _connection.AddColumn(Logger, "TypedBaseItems", "TrailerTypes", "Text");
PrepareStatements();
@@ -353,7 +355,9 @@ namespace MediaBrowser.Server.Implementations.Persistence
"DateLastSaved",
"LockedFields",
"Studios",
- "Tags"
+ "Tags",
+ "SourceType",
+ "TrailerTypes"
};
private readonly string[] _mediaStreamSaveColumns =
@@ -453,7 +457,9 @@ namespace MediaBrowser.Server.Implementations.Persistence
"IsFolder",
"UnratedType",
"TopParentId",
- "IsItemByName"
+ "IsItemByName",
+ "SourceType",
+ "TrailerTypes"
};
_saveItemCommand = _connection.CreateCommand();
_saveItemCommand.CommandText = "replace into TypedBaseItems (" + string.Join(",", saveColumns.ToArray()) + ") values (";
@@ -747,6 +753,18 @@ namespace MediaBrowser.Server.Implementations.Persistence
}
_saveItemCommand.GetParameter(index++).Value = isByName;
+ _saveItemCommand.GetParameter(index++).Value = item.SourceType.ToString();
+
+ var trailer = item as Trailer;
+ if (trailer != null)
+ {
+ _saveItemCommand.GetParameter(index++).Value = string.Join("|", trailer.TrailerTypes.Select(i => i.ToString()).ToArray());
+ }
+ else
+ {
+ _saveItemCommand.GetParameter(index++).Value = null;
+ }
+
_saveItemCommand.Transaction = transaction;
_saveItemCommand.ExecuteNonQuery();
@@ -1109,6 +1127,20 @@ namespace MediaBrowser.Server.Implementations.Persistence
item.Tags = reader.GetString(48).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToList();
}
+ if (!reader.IsDBNull(49))
+ {
+ item.SourceType = (SourceType)Enum.Parse(typeof(SourceType), reader.GetString(49), true);
+ }
+
+ var trailer = item as Trailer;
+ if (trailer != null)
+ {
+ if (!reader.IsDBNull(50))
+ {
+ trailer.TrailerTypes = reader.GetString(50).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).Select(i => (TrailerType)Enum.Parse(typeof(TrailerType), i, true)).ToList();
+ }
+ }
+
return item;
}
@@ -1871,6 +1903,56 @@ namespace MediaBrowser.Server.Implementations.Persistence
cmd.Parameters.Add(cmd, "@MaxStartDate", DbType.Date).Value = query.MaxStartDate.Value;
}
+ if (query.SourceTypes.Length == 1)
+ {
+ whereClauses.Add("SourceType=@SourceType");
+ cmd.Parameters.Add(cmd, "@SourceType", DbType.String).Value = query.SourceTypes[0];
+ }
+ else if (query.SourceTypes.Length > 1)
+ {
+ var inClause = string.Join(",", query.SourceTypes.Select(i => "'" + i + "'").ToArray());
+ whereClauses.Add(string.Format("SourceType in ({0})", inClause));
+ }
+
+ if (query.ExcludeSourceTypes.Length == 1)
+ {
+ whereClauses.Add("SourceType<>@SourceType");
+ cmd.Parameters.Add(cmd, "@SourceType", DbType.String).Value = query.SourceTypes[0];
+ }
+ else if (query.ExcludeSourceTypes.Length > 1)
+ {
+ var inClause = string.Join(",", query.ExcludeSourceTypes.Select(i => "'" + i + "'").ToArray());
+ whereClauses.Add(string.Format("SourceType not in ({0})", inClause));
+ }
+
+ if (query.TrailerTypes.Length > 0)
+ {
+ var clauses = new List<string>();
+ var index = 0;
+ foreach (var type in query.TrailerTypes)
+ {
+ clauses.Add("TrailerTypes like @TrailerTypes" + index);
+ cmd.Parameters.Add(cmd, "@TrailerTypes" + index, DbType.String).Value = "%" + type + "%";
+ index++;
+ }
+ var clause = "(" + string.Join(" OR ", clauses.ToArray()) + ")";
+ whereClauses.Add(clause);
+ }
+
+ if (query.ExcludeTrailerTypes.Length > 0)
+ {
+ var clauses = new List<string>();
+ var index = 0;
+ foreach (var type in query.ExcludeTrailerTypes)
+ {
+ clauses.Add("TrailerTypes not like @TrailerTypes" + index);
+ cmd.Parameters.Add(cmd, "@TrailerTypes" + index, DbType.String).Value = "%" + type + "%";
+ index++;
+ }
+ var clause = "(" + string.Join(" AND ", clauses.ToArray()) + ")";
+ whereClauses.Add(clause);
+ }
+
if (query.IsAiring.HasValue)
{
if (query.IsAiring.Value)
@@ -2046,7 +2128,6 @@ namespace MediaBrowser.Server.Implementations.Persistence
typeof(Trailer),
typeof(BoxSet),
typeof(Episode),
- typeof(ChannelVideoItem),
typeof(Season),
typeof(Series),
typeof(Book),
@@ -2152,8 +2233,6 @@ namespace MediaBrowser.Server.Implementations.Persistence
dict[t.Name] = new[] { t.FullName };
}
- dict["ChannelItem"] = new[] { typeof(ChannelVideoItem).FullName, typeof(ChannelAudioItem).FullName, typeof(ChannelFolderItem).FullName };
- dict["LiveTvItem"] = new[] { typeof(LiveTvAudioRecording).FullName, typeof(LiveTvVideoRecording).FullName, typeof(LiveTvChannel).FullName, typeof(LiveTvProgram).FullName };
dict["Recording"] = new[] { typeof(LiveTvAudioRecording).FullName, typeof(LiveTvVideoRecording).FullName };
dict["Program"] = new[] { typeof(LiveTvProgram).FullName };
dict["TvChannel"] = new[] { typeof(LiveTvChannel).FullName };
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
index 8ebc8d91e..e22f86b11 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
@@ -536,7 +536,7 @@ namespace MediaBrowser.Server.Implementations.Sync
}
}
- if (item is LiveTvChannel || item is IChannelItem)
+ if (item.SourceType != SourceType.Library)
{
return false;
}