aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs1
-rw-r--r--MediaBrowser.Controller/LiveTv/LiveTvProgram.cs6
-rw-r--r--MediaBrowser.Controller/LiveTv/ProgramInfo.cs5
-rw-r--r--MediaBrowser.Server.Implementations/Library/SearchEngine.cs272
-rw-r--r--MediaBrowser.Server.Implementations/Library/Validators/GameGenresValidator.cs27
-rw-r--r--MediaBrowser.Server.Implementations/Library/Validators/GenresValidator.cs27
-rw-r--r--MediaBrowser.Server.Implementations/Library/Validators/MusicGenresValidator.cs28
-rw-r--r--MediaBrowser.Server.Implementations/Library/Validators/StudiosValidator.cs28
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs18
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs5
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs9
-rw-r--r--MediaBrowser.WebDashboard/Api/PackageCreator.cs2
-rw-r--r--MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj18
13 files changed, 224 insertions, 222 deletions
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index c4917b0d1..cd5c39173 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -485,6 +485,7 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the parent.
/// </summary>
/// <value>The parent.</value>
+ [IgnoreDataMember]
public Folder Parent
{
get
diff --git a/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs b/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs
index 14944d36f..12052905f 100644
--- a/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs
+++ b/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs
@@ -31,6 +31,12 @@ namespace MediaBrowser.Controller.LiveTv
}
/// <summary>
+ /// Gets or sets the etag.
+ /// </summary>
+ /// <value>The etag.</value>
+ public string Etag { get; set; }
+
+ /// <summary>
/// Id of the program.
/// </summary>
public string ExternalId { get; set; }
diff --git a/MediaBrowser.Controller/LiveTv/ProgramInfo.cs b/MediaBrowser.Controller/LiveTv/ProgramInfo.cs
index 467264e7a..a6a3e6108 100644
--- a/MediaBrowser.Controller/LiveTv/ProgramInfo.cs
+++ b/MediaBrowser.Controller/LiveTv/ProgramInfo.cs
@@ -180,6 +180,11 @@ namespace MediaBrowser.Controller.LiveTv
/// </summary>
/// <value>The episode number.</value>
public int? EpisodeNumber { get; set; }
+ /// <summary>
+ /// Gets or sets the etag.
+ /// </summary>
+ /// <value>The etag.</value>
+ public string Etag { get; set; }
public ProgramInfo()
{
diff --git a/MediaBrowser.Server.Implementations/Library/SearchEngine.cs b/MediaBrowser.Server.Implementations/Library/SearchEngine.cs
index 21e92786d..d4ff89b4f 100644
--- a/MediaBrowser.Server.Implementations/Library/SearchEngine.cs
+++ b/MediaBrowser.Server.Implementations/Library/SearchEngine.cs
@@ -33,26 +33,17 @@ namespace MediaBrowser.Server.Implementations.Library
public async Task<QueryResult<SearchHintInfo>> GetSearchHints(SearchQuery query)
{
- IEnumerable<BaseItem> inputItems;
-
- Func<BaseItem, bool> filter = i => !(i is ICollectionFolder);
-
User user = null;
if (string.IsNullOrWhiteSpace(query.UserId))
{
- inputItems = _libraryManager.RootFolder.GetRecursiveChildren(filter);
}
else
{
user = _userManager.GetUserById(query.UserId);
-
- inputItems = user.RootFolder.GetRecursiveChildren(user, filter);
}
- inputItems = _libraryManager.ReplaceVideosWithPrimaryVersions(inputItems);
-
- var results = await GetSearchHints(inputItems, query, user).ConfigureAwait(false);
+ var results = await GetSearchHints(query, user).ConfigureAwait(false);
var searchResultArray = results.ToArray();
results = searchResultArray;
@@ -77,15 +68,22 @@ namespace MediaBrowser.Server.Implementations.Library
};
}
+ private void AddIfMissing(List<string> list, string value)
+ {
+ if (!list.Contains(value, StringComparer.OrdinalIgnoreCase))
+ {
+ list.Add(value);
+ }
+ }
+
/// <summary>
/// Gets the search hints.
/// </summary>
- /// <param name="inputItems">The input items.</param>
/// <param name="query">The query.</param>
/// <param name="user">The user.</param>
/// <returns>IEnumerable{SearchHintResult}.</returns>
/// <exception cref="System.ArgumentNullException">searchTerm</exception>
- private Task<IEnumerable<SearchHintInfo>> GetSearchHints(IEnumerable<BaseItem> inputItems, SearchQuery query, User user)
+ private Task<IEnumerable<SearchHintInfo>> GetSearchHints(SearchQuery query, User user)
{
var searchTerm = query.SearchTerm;
@@ -100,207 +98,80 @@ namespace MediaBrowser.Server.Implementations.Library
var hints = new List<Tuple<BaseItem, string, int>>();
- var items = inputItems.Where(i => !(i is MusicArtist)).ToList();
+ var excludeItemTypes = new List<string>();
+ var includeItemTypes = (query.IncludeItemTypes ?? new string[] { }).ToList();
- if (query.IncludeMedia)
- {
- var mediaItems = _libraryManager.GetItems(new InternalItemsQuery
- {
- NameContains = searchTerm,
- ExcludeItemTypes = new[]
- {
- typeof (Person).Name,
- typeof (Genre).Name,
- typeof (MusicArtist).Name,
- typeof (GameGenre).Name,
- typeof (MusicGenre).Name,
- typeof (Year).Name,
- typeof (Studio).Name
- },
- IncludeItemTypes = query.IncludeItemTypes
-
- }).Items;
-
- // Add search hints based on item name
- hints.AddRange(mediaItems.Where(i => IncludeInSearch(i) && (user == null || i.IsVisibleStandalone(user)) && !(i is CollectionFolder)).Select(item =>
- {
- var index = GetIndex(item.Name, searchTerm, terms);
+ excludeItemTypes.Add(typeof(Year).Name);
- return new Tuple<BaseItem, string, int>(item, index.Item1, index.Item2);
- }));
- }
-
- if (query.IncludeArtists && (query.IncludeItemTypes.Length == 0 || query.IncludeItemTypes.Contains("MusicArtist", StringComparer.OrdinalIgnoreCase)))
+ if (query.IncludeGenres && (includeItemTypes.Count == 0 || includeItemTypes.Contains("Genre", StringComparer.OrdinalIgnoreCase)))
{
- // Find artists
- var artists = items.OfType<Audio>()
- .SelectMany(i => i.AllArtists)
- .Where(i => !string.IsNullOrWhiteSpace(i))
- .DistinctNames()
- .ToList();
-
- foreach (var item in artists)
+ if (!query.IncludeMedia)
{
- var index = GetIndex(item, searchTerm, terms);
-
- if (index.Item2 != -1)
- {
- try
- {
- var artist = _libraryManager.GetArtist(item);
-
- hints.Add(new Tuple<BaseItem, string, int>(artist, index.Item1, index.Item2));
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error getting {0}", ex, item);
- }
- }
+ AddIfMissing(includeItemTypes, typeof(Genre).Name);
+ AddIfMissing(includeItemTypes, typeof(GameGenre).Name);
+ AddIfMissing(includeItemTypes, typeof(MusicGenre).Name);
}
}
-
- if (query.IncludeGenres && (query.IncludeItemTypes.Length == 0 || query.IncludeItemTypes.Contains("Genre", StringComparer.OrdinalIgnoreCase)))
+ else
{
- // Find genres, from non-audio items
- var genres = items.Where(i => !(i is IHasMusicGenres) && !(i is Game))
- .SelectMany(i => i.Genres)
- .Where(i => !string.IsNullOrWhiteSpace(i))
- .Distinct(StringComparer.OrdinalIgnoreCase)
- .ToList();
-
- foreach (var item in genres)
- {
- var index = GetIndex(item, searchTerm, terms);
-
- if (index.Item2 != -1)
- {
- try
- {
- var genre = _libraryManager.GetGenre(item);
-
- hints.Add(new Tuple<BaseItem, string, int>(genre, index.Item1, index.Item2));
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error getting {0}", ex, item);
- }
- }
- }
-
- // Find music genres
- var musicGenres = items.Where(i => i is IHasMusicGenres)
- .SelectMany(i => i.Genres)
- .Where(i => !string.IsNullOrWhiteSpace(i))
- .Distinct(StringComparer.OrdinalIgnoreCase)
- .ToList();
+ AddIfMissing(excludeItemTypes, typeof(Genre).Name);
+ AddIfMissing(excludeItemTypes, typeof(GameGenre).Name);
+ AddIfMissing(excludeItemTypes, typeof(MusicGenre).Name);
+ }
- foreach (var item in musicGenres)
+ if (query.IncludePeople && (includeItemTypes.Count == 0 || includeItemTypes.Contains("People", StringComparer.OrdinalIgnoreCase)))
+ {
+ if (!query.IncludeMedia)
{
- var index = GetIndex(item, searchTerm, terms);
-
- if (index.Item2 != -1)
- {
- try
- {
- var genre = _libraryManager.GetMusicGenre(item);
-
- hints.Add(new Tuple<BaseItem, string, int>(genre, index.Item1, index.Item2));
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error getting {0}", ex, item);
- }
- }
+ AddIfMissing(includeItemTypes, typeof(Person).Name);
}
+ }
+ else
+ {
+ AddIfMissing(excludeItemTypes, typeof(Person).Name);
+ }
- // Find music genres
- var gameGenres = items.OfType<Game>()
- .SelectMany(i => i.Genres)
- .Where(i => !string.IsNullOrWhiteSpace(i))
- .Distinct(StringComparer.OrdinalIgnoreCase)
- .ToList();
-
- foreach (var item in gameGenres)
+ if (query.IncludeStudios && (includeItemTypes.Count == 0 || includeItemTypes.Contains("Studio", StringComparer.OrdinalIgnoreCase)))
+ {
+ if (!query.IncludeMedia)
{
- var index = GetIndex(item, searchTerm, terms);
-
- if (index.Item2 != -1)
- {
- try
- {
- var genre = _libraryManager.GetGameGenre(item);
-
- hints.Add(new Tuple<BaseItem, string, int>(genre, index.Item1, index.Item2));
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error getting {0}", ex, item);
- }
- }
+ AddIfMissing(includeItemTypes, typeof(Studio).Name);
}
}
-
- if (query.IncludeStudios && (query.IncludeItemTypes.Length == 0 || query.IncludeItemTypes.Contains("Studio", StringComparer.OrdinalIgnoreCase)))
+ else
{
- // Find studios
- var studios = items.SelectMany(i => i.Studios)
- .Where(i => !string.IsNullOrWhiteSpace(i))
- .Distinct(StringComparer.OrdinalIgnoreCase)
- .ToList();
+ AddIfMissing(excludeItemTypes, typeof(Studio).Name);
+ }
- foreach (var item in studios)
+ if (query.IncludeArtists && (includeItemTypes.Count == 0 || includeItemTypes.Contains("MusicArtist", StringComparer.OrdinalIgnoreCase)))
+ {
+ if (!query.IncludeMedia)
{
- var index = GetIndex(item, searchTerm, terms);
-
- if (index.Item2 != -1)
- {
- try
- {
- var studio = _libraryManager.GetStudio(item);
-
- hints.Add(new Tuple<BaseItem, string, int>(studio, index.Item1, index.Item2));
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error getting {0}", ex, item);
- }
- }
+ AddIfMissing(includeItemTypes, typeof(MusicArtist).Name);
}
}
+ else
+ {
+ AddIfMissing(excludeItemTypes, typeof(MusicArtist).Name);
+ }
- if (query.IncludePeople && (query.IncludeItemTypes.Length == 0 || query.IncludeItemTypes.Contains("Person", StringComparer.OrdinalIgnoreCase)))
+ var mediaItems = _libraryManager.GetItems(new InternalItemsQuery
{
- var itemIds = items.Select(i => i.Id).ToList();
+ NameContains = searchTerm,
+ ExcludeItemTypes = excludeItemTypes.ToArray(),
+ IncludeItemTypes = includeItemTypes.ToArray(),
+ MaxParentalRating = user == null ? null : user.Policy.MaxParentalRating,
+ Limit = query.Limit.HasValue ? query.Limit * 3 : null
- // Find persons
- var persons = _libraryManager.GetPeople(new InternalPeopleQuery
- {
- NameContains = searchTerm
- })
- .Where(i => itemIds.Contains(i.ItemId))
- .Select(i => i.Name)
- .Distinct(StringComparer.OrdinalIgnoreCase)
- .ToList();
-
- foreach (var item in persons)
- {
- var index = GetIndex(item, searchTerm, terms);
+ }).Items;
- if (index.Item2 != -1)
- {
- try
- {
- var person = _libraryManager.GetPerson(item);
-
- hints.Add(new Tuple<BaseItem, string, int>(person, index.Item1, index.Item2));
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error getting {0}", ex, item);
- }
- }
- }
- }
+ // Add search hints based on item name
+ hints.AddRange(mediaItems.Where(i => IncludeInSearch(i) && IsVisible(i, user) && !(i is CollectionFolder)).Select(item =>
+ {
+ var index = GetIndex(item.Name, searchTerm, terms);
+
+ return new Tuple<BaseItem, string, int>(item, index.Item1, index.Item2);
+ }));
var returnValue = hints.Where(i => i.Item3 >= 0).OrderBy(i => i.Item3).Select(i => new SearchHintInfo
{
@@ -311,13 +182,32 @@ namespace MediaBrowser.Server.Implementations.Library
return Task.FromResult(returnValue);
}
+ private bool IsVisible(BaseItem item, User user)
+ {
+ if (user == null)
+ {
+ return true;
+ }
+
+ if (item is IItemByName)
+ {
+ var dual = item as IHasDualAccess;
+ if (dual == null || dual.IsAccessedByName)
+ {
+ return true;
+ }
+ }
+
+ return item.IsVisibleStandalone(user);
+ }
+
private bool IncludeInSearch(BaseItem item)
{
var episode = item as Episode;
if (episode != null)
{
- if (episode.IsVirtualUnaired || episode.IsMissingEpisode)
+ if (episode.IsMissingEpisode)
{
return false;
}
diff --git a/MediaBrowser.Server.Implementations/Library/Validators/GameGenresValidator.cs b/MediaBrowser.Server.Implementations/Library/Validators/GameGenresValidator.cs
index fe2e6a114..ee06fecdf 100644
--- a/MediaBrowser.Server.Implementations/Library/Validators/GameGenresValidator.cs
+++ b/MediaBrowser.Server.Implementations/Library/Validators/GameGenresValidator.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Controller.Entities;
+using System.Collections.Generic;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Logging;
using System;
@@ -42,12 +43,16 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
var numComplete = 0;
var count = items.Count;
+ var validIds = new List<Guid>();
+
foreach (var name in items)
{
try
{
var itemByName = _libraryManager.GetGameGenre(name);
+ validIds.Add(itemByName.Id);
+
await itemByName.RefreshMetadata(cancellationToken).ConfigureAwait(false);
}
catch (OperationCanceledException)
@@ -68,6 +73,26 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
progress.Report(percent);
}
+ var allIds = _libraryManager.GetItemIds(new InternalItemsQuery
+ {
+ IncludeItemTypes = new[] { typeof(GameGenre).Name }
+ });
+
+ var invalidIds = allIds
+ .Except(validIds)
+ .ToList();
+
+ foreach (var id in invalidIds)
+ {
+ var item = _libraryManager.GetItemById(id);
+
+ await _libraryManager.DeleteItem(item, new DeleteOptions
+ {
+ DeleteFileLocation = false
+
+ }).ConfigureAwait(false);
+ }
+
progress.Report(100);
}
}
diff --git a/MediaBrowser.Server.Implementations/Library/Validators/GenresValidator.cs b/MediaBrowser.Server.Implementations/Library/Validators/GenresValidator.cs
index fac5cfc35..6ab70ea22 100644
--- a/MediaBrowser.Server.Implementations/Library/Validators/GenresValidator.cs
+++ b/MediaBrowser.Server.Implementations/Library/Validators/GenresValidator.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Controller.Entities;
+using System.Collections.Generic;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Logging;
@@ -43,12 +44,16 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
var numComplete = 0;
var count = items.Count;
+ var validIds = new List<Guid>();
+
foreach (var name in items)
{
try
{
var itemByName = _libraryManager.GetGenre(name);
+ validIds.Add(itemByName.Id);
+
await itemByName.RefreshMetadata(cancellationToken).ConfigureAwait(false);
}
catch (OperationCanceledException)
@@ -69,6 +74,26 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
progress.Report(percent);
}
+ var allIds = _libraryManager.GetItemIds(new InternalItemsQuery
+ {
+ IncludeItemTypes = new[] { typeof(Genre).Name }
+ });
+
+ var invalidIds = allIds
+ .Except(validIds)
+ .ToList();
+
+ foreach (var id in invalidIds)
+ {
+ var item = _libraryManager.GetItemById(id);
+
+ await _libraryManager.DeleteItem(item, new DeleteOptions
+ {
+ DeleteFileLocation = false
+
+ }).ConfigureAwait(false);
+ }
+
progress.Report(100);
}
}
diff --git a/MediaBrowser.Server.Implementations/Library/Validators/MusicGenresValidator.cs b/MediaBrowser.Server.Implementations/Library/Validators/MusicGenresValidator.cs
index e3be75e9b..8be0f4349 100644
--- a/MediaBrowser.Server.Implementations/Library/Validators/MusicGenresValidator.cs
+++ b/MediaBrowser.Server.Implementations/Library/Validators/MusicGenresValidator.cs
@@ -1,4 +1,6 @@
-using MediaBrowser.Controller.Entities.Audio;
+using System.Collections.Generic;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Logging;
using System;
@@ -42,12 +44,16 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
var numComplete = 0;
var count = items.Count;
+ var validIds = new List<Guid>();
+
foreach (var name in items)
{
try
{
var itemByName = _libraryManager.GetMusicGenre(name);
+ validIds.Add(itemByName.Id);
+
await itemByName.RefreshMetadata(cancellationToken).ConfigureAwait(false);
}
catch (OperationCanceledException)
@@ -68,6 +74,26 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
progress.Report(percent);
}
+ var allIds = _libraryManager.GetItemIds(new InternalItemsQuery
+ {
+ IncludeItemTypes = new[] { typeof(MusicGenre).Name }
+ });
+
+ var invalidIds = allIds
+ .Except(validIds)
+ .ToList();
+
+ foreach (var id in invalidIds)
+ {
+ var item = _libraryManager.GetItemById(id);
+
+ await _libraryManager.DeleteItem(item, new DeleteOptions
+ {
+ DeleteFileLocation = false
+
+ }).ConfigureAwait(false);
+ }
+
progress.Report(100);
}
}
diff --git a/MediaBrowser.Server.Implementations/Library/Validators/StudiosValidator.cs b/MediaBrowser.Server.Implementations/Library/Validators/StudiosValidator.cs
index 066b96853..c90cbb2f0 100644
--- a/MediaBrowser.Server.Implementations/Library/Validators/StudiosValidator.cs
+++ b/MediaBrowser.Server.Implementations/Library/Validators/StudiosValidator.cs
@@ -1,6 +1,8 @@
-using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Logging;
using System;
+using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
@@ -41,12 +43,16 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
var numComplete = 0;
var count = items.Count;
+ var validIds = new List<Guid>();
+
foreach (var name in items)
{
try
{
var itemByName = _libraryManager.GetStudio(name);
+ validIds.Add(itemByName.Id);
+
await itemByName.RefreshMetadata(cancellationToken).ConfigureAwait(false);
}
catch (OperationCanceledException)
@@ -67,6 +73,26 @@ namespace MediaBrowser.Server.Implementations.Library.Validators
progress.Report(percent);
}
+ var allIds = _libraryManager.GetItemIds(new InternalItemsQuery
+ {
+ IncludeItemTypes = new[] { typeof(Studio).Name }
+ });
+
+ var invalidIds = allIds
+ .Except(validIds)
+ .ToList();
+
+ foreach (var id in invalidIds)
+ {
+ var item = _libraryManager.GetItemById(id);
+
+ await _libraryManager.DeleteItem(item, new DeleteOptions
+ {
+ DeleteFileLocation = false
+
+ }).ConfigureAwait(false);
+ }
+
progress.Report(100);
}
}
diff --git a/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs b/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
index 708828d47..3c65ac739 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
@@ -627,31 +627,17 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
private async Task UpdateTimersForSeriesTimer(List<ProgramInfo> epgData, SeriesTimerInfo seriesTimer)
{
- var newTimers = GetTimersForSeries(seriesTimer, epgData, _recordingProvider.GetAll()).ToList();
-
- var existingTimers = _timerProvider.GetAll()
- .Where(i => string.Equals(i.SeriesTimerId, seriesTimer.Id, StringComparison.OrdinalIgnoreCase))
- .ToList();
-
var registration = await GetRegistrationInfo("seriesrecordings").ConfigureAwait(false);
if (registration.IsValid)
{
+ var newTimers = GetTimersForSeries(seriesTimer, epgData, _recordingProvider.GetAll()).ToList();
+
foreach (var timer in newTimers)
{
_timerProvider.AddOrUpdate(timer);
}
}
-
- var newTimerIds = newTimers.Select(i => i.Id).ToList();
-
- foreach (var timer in existingTimers)
- {
- if (!newTimerIds.Contains(timer.Id, StringComparer.OrdinalIgnoreCase))
- {
- CancelTimerInternal(timer.Id);
- }
- }
}
private IEnumerable<TimerInfo> GetTimersForSeries(SeriesTimerInfo seriesTimer, IEnumerable<ProgramInfo> allPrograms, IReadOnlyList<RecordingInfo> currentRecordings)
diff --git a/MediaBrowser.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs b/MediaBrowser.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs
index 7a6860d65..129f922b3 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs
@@ -304,7 +304,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
IsKids = string.Equals(details.audience, "children", StringComparison.OrdinalIgnoreCase),
IsSports = showType.IndexOf("sports", StringComparison.OrdinalIgnoreCase) != -1,
IsMovie = showType.IndexOf("movie", StringComparison.OrdinalIgnoreCase) != -1 || showType.IndexOf("film", StringComparison.OrdinalIgnoreCase) != -1,
- ShowId = programInfo.programID
+ ShowId = programInfo.programID,
+ Etag = programInfo.md5
};
if (programInfo.videoProperties != null)
@@ -408,7 +409,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
;
});
imageIdString = imageIdString.TrimEnd(',') + "]";
- _logger.Debug("Json for show images = " + imageIdString);
+
var httpOptions = new HttpRequestOptions()
{
Url = ApiUrl + "/metadata/programs",
diff --git a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
index 4109617db..1721d6101 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
@@ -593,7 +593,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv
Name = info.Name,
Id = id,
DateCreated = DateTime.UtcNow,
- DateModified = DateTime.UtcNow
+ DateModified = DateTime.UtcNow,
+ Etag = info.Etag
};
}
@@ -639,7 +640,11 @@ namespace MediaBrowser.Server.Implementations.LiveTv
}
else
{
- await _libraryManager.UpdateItem(item, ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false);
+ if (string.IsNullOrWhiteSpace(info.Etag) || !string.Equals(info.Etag, item.Etag, StringComparison.OrdinalIgnoreCase))
+ {
+ item.Etag = info.Etag;
+ await _libraryManager.UpdateItem(item, ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false);
+ }
}
_providerManager.QueueRefresh(item.Id, new MetadataRefreshOptions());
diff --git a/MediaBrowser.WebDashboard/Api/PackageCreator.cs b/MediaBrowser.WebDashboard/Api/PackageCreator.cs
index 104d02bcf..463c8829c 100644
--- a/MediaBrowser.WebDashboard/Api/PackageCreator.cs
+++ b/MediaBrowser.WebDashboard/Api/PackageCreator.cs
@@ -61,7 +61,7 @@ namespace MediaBrowser.WebDashboard.Api
// jQuery ajax doesn't seem to handle if-modified-since correctly
if (IsFormat(path, "html"))
{
- if (IsCoreHtml(path))
+ if (IsCoreHtml(path) && path.IndexOf(".template.html", StringComparison.OrdinalIgnoreCase) == -1)
{
resourceStream = await ModifyHtml(resourceStream, mode, appVersion, localizationCulture, enableMinification).ConfigureAwait(false);
}
diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
index e256cdb7c..4820535d0 100644
--- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
+++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
@@ -186,9 +186,6 @@
<Content Include="dashboard-ui\css\nowplayingbar.css">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\livetvguideprovider-scd.html">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
<Content Include="dashboard-ui\livetvguideprovider.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -222,9 +219,6 @@
<Content Include="dashboard-ui\scripts\homeupcoming.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="dashboard-ui\scripts\livetvguideprovider-scd.js">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
<Content Include="dashboard-ui\scripts\livetvguideprovider.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -264,6 +258,9 @@
<Content Include="dashboard-ui\scripts\slideshow.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
+ <Content Include="dashboard-ui\scripts\wizardlivetvguide.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
<Content Include="dashboard-ui\scripts\wizardlivetvtuner.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -377,6 +374,12 @@
<Content Include="dashboard-ui\thirdparty\viblast\worker.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
+ <Content Include="dashboard-ui\tvproviders\schedulesdirect.js">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="dashboard-ui\tvproviders\schedulesdirect.template.html">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
<Content Include="dashboard-ui\voice\voice.css">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -1786,6 +1789,9 @@
<Content Include="dashboard-ui\wizardagreement.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
+ <Content Include="dashboard-ui\wizardlivetvguide.html">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
<Content Include="dashboard-ui\wizardlivetvtuner.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>