aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Implementations')
-rw-r--r--MediaBrowser.Server.Implementations/Dto/DtoService.cs8
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs4
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs5
-rw-r--r--MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs10
-rw-r--r--MediaBrowser.Server.Implementations/Library/LibraryManager.cs12
-rw-r--r--MediaBrowser.Server.Implementations/Library/SearchEngine.cs3
-rw-r--r--MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs40
-rw-r--r--MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs60
-rw-r--r--MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs13
-rw-r--r--MediaBrowser.Server.Implementations/TV/TVSeriesManager.cs20
10 files changed, 115 insertions, 60 deletions
diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs
index 20e1eb5434..fcda802f4d 100644
--- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs
+++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs
@@ -472,7 +472,7 @@ namespace MediaBrowser.Server.Implementations.Dto
// These are just far too slow.
// TODO: Disable for CollectionFolder
- if (!(folder is UserRootFolder) && !(folder is UserView))
+ if (!(folder is UserRootFolder) && !(folder is UserView) && !(folder is IChannelItem))
{
SetSpecialCounts(folder, user, dto, fields, syncProgress);
}
@@ -1042,7 +1042,11 @@ namespace MediaBrowser.Server.Implementations.Dto
dto.IsFolder = item.IsFolder;
dto.MediaType = item.MediaType;
dto.LocationType = item.LocationType;
- dto.IsHD = item.IsHD;
+ if (item.IsHD.HasValue && item.IsHD.Value)
+ {
+ dto.IsHD = item.IsHD;
+ }
+ dto.Audio = item.Audio;
dto.PreferredMetadataCountryCode = item.PreferredMetadataCountryCode;
dto.PreferredMetadataLanguage = item.PreferredMetadataLanguage;
diff --git a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs
index e8bb40ba11..6abfa06748 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs
@@ -92,7 +92,9 @@ namespace MediaBrowser.Server.Implementations.HttpServer
{typeof (FileNotFoundException), 404},
{typeof (DirectoryNotFoundException), 404},
{typeof (SecurityException), 401},
- {typeof (UnauthorizedAccessException), 500}
+ {typeof (PaymentRequiredException), 402},
+ {typeof (UnauthorizedAccessException), 500},
+ {typeof (ApplicationException), 500}
};
HostConfig.Instance.DebugMode = true;
diff --git a/MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs b/MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs
index 02ce38ef1a..fae702023a 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/LoggerUtils.cs
@@ -16,7 +16,10 @@ namespace MediaBrowser.Server.Implementations.HttpServer
/// <param name="duration">The duration.</param>
public static void LogResponse(ILogger logger, int statusCode, string url, string endPoint, TimeSpan duration)
{
- logger.Info("HTTP Response {0} to {1}. Time: {2}ms. {3}", statusCode, endPoint, Convert.ToInt32(duration.TotalMilliseconds).ToString(CultureInfo.InvariantCulture), url);
+ var durationMs = duration.TotalMilliseconds;
+ var logSuffix = durationMs >= 1000 ? "ms (slow)" : "ms";
+
+ logger.Info("HTTP Response {0} to {1}. Time: {2}{3}. {4}", statusCode, endPoint, Convert.ToInt32(durationMs).ToString(CultureInfo.InvariantCulture), logSuffix, url);
}
}
}
diff --git a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs
index f8178c1155..9f80c8ac98 100644
--- a/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs
+++ b/MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs
@@ -183,15 +183,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
/// <param name="request">The request.</param>
private static void LogRequest(ILogger logger, HttpListenerRequest request)
{
- var log = new StringBuilder();
-
- var headers = string.Join(",", request.Headers.AllKeys.Where(i => !string.Equals(i, "cookie", StringComparison.OrdinalIgnoreCase) && !string.Equals(i, "Referer", StringComparison.OrdinalIgnoreCase)).Select(k => k + "=" + request.Headers[k]));
-
- log.AppendLine("Ip: " + request.RemoteEndPoint + ". Headers: " + headers);
-
- var type = request.IsWebSocketRequest ? "Web Socket" : "HTTP " + request.HttpMethod;
-
- logger.LogMultiline(type + " " + request.Url, LogSeverity.Info, log);
+ logger.Info("{0} {1}. UserAgent: {2}", (request.IsWebSocketRequest ? "WS" : "HTTP " + request.HttpMethod), request.Url, request.UserAgent ?? string.Empty);
}
private void HandleError(Exception ex, HttpListenerContext context)
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
index 92acd08d16..daa3d8ad41 100644
--- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
@@ -1280,6 +1280,11 @@ namespace MediaBrowser.Server.Implementations.Library
return ItemRepository.GetItemIdsList(query);
}
+ public IEnumerable<BaseItem> GetItems(InternalItemsQuery query, User user)
+ {
+ return GetItemIds(query).Select(GetItemById).Where(i => i.IsVisibleStandalone(user));
+ }
+
/// <summary>
/// Gets the intros.
/// </summary>
@@ -1811,14 +1816,9 @@ namespace MediaBrowser.Server.Implementations.Library
isNew = true;
}
- if (!item.UserId.HasValue)
+ if (!item.UserId.HasValue || !string.Equals(viewType, item.ViewType, StringComparison.OrdinalIgnoreCase))
{
item.UserId = user.Id;
- await item.UpdateToRepository(ItemUpdateType.MetadataEdit, cancellationToken).ConfigureAwait(false);
- }
-
- if (!string.Equals(viewType, item.ViewType, StringComparison.OrdinalIgnoreCase))
- {
item.ViewType = viewType;
await item.UpdateToRepository(ItemUpdateType.MetadataEdit, cancellationToken).ConfigureAwait(false);
}
diff --git a/MediaBrowser.Server.Implementations/Library/SearchEngine.cs b/MediaBrowser.Server.Implementations/Library/SearchEngine.cs
index d6aff11925..108a891e07 100644
--- a/MediaBrowser.Server.Implementations/Library/SearchEngine.cs
+++ b/MediaBrowser.Server.Implementations/Library/SearchEngine.cs
@@ -157,12 +157,11 @@ namespace MediaBrowser.Server.Implementations.Library
AddIfMissing(excludeItemTypes, typeof(CollectionFolder).Name);
- var mediaItems = _libraryManager.GetItems(new InternalItemsQuery
+ var mediaItems = _libraryManager.GetItems(new InternalItemsQuery(user)
{
NameContains = searchTerm,
ExcludeItemTypes = excludeItemTypes.ToArray(),
IncludeItemTypes = includeItemTypes.ToArray(),
- MaxParentalRating = user == null ? null : user.Policy.MaxParentalRating,
Limit = (query.Limit.HasValue ? (int?)(query.Limit.Value * 3) : null),
}).Items;
diff --git a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
index edfca0d6c4..d7c9edae3e 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
@@ -607,6 +607,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
var item = _libraryManager.GetItemById(id) as LiveTvProgram;
var isNew = false;
+ var forceUpdate = false;
if (item == null)
{
@@ -621,7 +622,11 @@ namespace MediaBrowser.Server.Implementations.LiveTv
};
}
- item.ChannelType = channelType;
+ //item.ChannelType = channelType;
+ if (!string.Equals(item.ServiceName, serviceName, StringComparison.Ordinal))
+ {
+ forceUpdate = true;
+ }
item.ServiceName = serviceName;
item.Audio = info.Audio;
@@ -666,7 +671,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
{
await _libraryManager.CreateItem(item, cancellationToken).ConfigureAwait(false);
}
- else if (string.IsNullOrWhiteSpace(info.Etag))
+ else if (forceUpdate || string.IsNullOrWhiteSpace(info.Etag))
{
await _libraryManager.UpdateItem(item, ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false);
}
@@ -814,7 +819,9 @@ namespace MediaBrowser.Server.Implementations.LiveTv
public async Task<QueryResult<BaseItemDto>> GetPrograms(ProgramQuery query, DtoOptions options, CancellationToken cancellationToken)
{
- var internalQuery = new InternalItemsQuery
+ var user = string.IsNullOrEmpty(query.UserId) ? null : _userManager.GetUserById(query.UserId);
+
+ var internalQuery = new InternalItemsQuery(user)
{
IncludeItemTypes = new[] { typeof(LiveTvProgram).Name },
MinEndDate = query.MinEndDate,
@@ -832,11 +839,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv
SortOrder = query.SortOrder ?? SortOrder.Ascending
};
- var user = string.IsNullOrEmpty(query.UserId) ? null : _userManager.GetUserById(query.UserId);
if (user != null)
{
- internalQuery.MaxParentalRating = user.Policy.MaxParentalRating;
-
if (user.Policy.BlockUnratedItems.Contains(UnratedItem.LiveTvProgram))
{
internalQuery.HasParentalRating = true;
@@ -874,7 +878,9 @@ namespace MediaBrowser.Server.Implementations.LiveTv
public async Task<QueryResult<LiveTvProgram>> GetRecommendedProgramsInternal(RecommendedProgramQuery query, CancellationToken cancellationToken)
{
- var internalQuery = new InternalItemsQuery
+ var user = _userManager.GetUserById(query.UserId);
+
+ var internalQuery = new InternalItemsQuery(user)
{
IncludeItemTypes = new[] { typeof(LiveTvProgram).Name },
IsAiring = query.IsAiring,
@@ -895,11 +901,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv
}
}
- var user = _userManager.GetUserById(query.UserId);
if (user != null)
{
- internalQuery.MaxParentalRating = user.Policy.MaxParentalRating;
-
if (user.Policy.BlockUnratedItems.Contains(UnratedItem.LiveTvProgram))
{
internalQuery.HasParentalRating = true;
@@ -1037,6 +1040,11 @@ namespace MediaBrowser.Server.Implementations.LiveTv
{
var internalProgram = GetInternalProgram(program.Id);
+ if (string.IsNullOrWhiteSpace(internalProgram.ServiceName))
+ {
+ continue;
+ }
+
List<TimerInfo> timerList;
if (!timers.TryGetValue(internalProgram.ServiceName, out timerList))
{
@@ -1052,7 +1060,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv
}
}
-
var timer = timerList.FirstOrDefault(i => string.Equals(i.ProgramId, internalProgram.ExternalId, StringComparison.OrdinalIgnoreCase));
if (timer != null)
@@ -1429,18 +1436,10 @@ namespace MediaBrowser.Server.Implementations.LiveTv
public void AddInfoToProgramDto(BaseItem item, BaseItemDto dto, bool addChannelInfo, User user = null)
{
var program = (LiveTvProgram)item;
- var service = GetService(program);
-
- dto.Id = _tvDtoService.GetInternalProgramId(service.Name, program.ExternalId).ToString("N");
dto.StartDate = program.StartDate;
dto.EpisodeTitle = program.EpisodeTitle;
- dto.Audio = program.Audio;
- if (program.IsHD.HasValue && program.IsHD.Value)
- {
- dto.IsHD = program.IsHD;
- }
if (program.IsRepeat)
{
dto.IsRepeat = program.IsRepeat;
@@ -1499,7 +1498,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv
var info = recording;
- dto.Id = item.Id.ToString("N");
dto.SeriesTimerId = string.IsNullOrEmpty(info.SeriesTimerId)
? null
: _tvDtoService.GetInternalSeriesTimerId(service.Name, info.SeriesTimerId).ToString("N");
@@ -1508,8 +1506,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv
dto.RecordingStatus = info.Status;
dto.IsRepeat = info.IsRepeat;
dto.EpisodeTitle = info.EpisodeTitle;
- dto.Audio = info.Audio;
- dto.IsHD = info.IsHD;
dto.IsMovie = info.IsMovie;
dto.IsSeries = info.IsSeries;
dto.IsSports = info.IsSports;
diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
index 256b057d94..730632bb30 100644
--- a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
+++ b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
@@ -19,6 +19,7 @@ using System.Runtime.Serialization;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.Channels;
+using MediaBrowser.Model.LiveTv;
namespace MediaBrowser.Server.Implementations.Persistence
{
@@ -76,7 +77,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
private IDbCommand _deleteStreamsCommand;
private IDbCommand _saveStreamCommand;
- private const int LatestSchemaVersion = 16;
+ private const int LatestSchemaVersion = 17;
/// <summary>
/// Initializes a new instance of the <see cref="SqliteItemRepository"/> class.
@@ -202,7 +203,9 @@ namespace MediaBrowser.Server.Implementations.Persistence
_connection.AddColumn(_logger, "TypedBaseItems", "IsInMixedFolder", "BIT");
_connection.AddColumn(_logger, "TypedBaseItems", "LockedFields", "Text");
_connection.AddColumn(_logger, "TypedBaseItems", "Studios", "Text");
-
+ _connection.AddColumn(_logger, "TypedBaseItems", "Audio", "Text");
+ _connection.AddColumn(_logger, "TypedBaseItems", "ExternalServiceId", "Text");
+
PrepareStatements();
new MediaStreamColumns(_connection, _logger).AddColumns();
@@ -311,7 +314,10 @@ namespace MediaBrowser.Server.Implementations.Persistence
"DateCreated",
"DateModified",
"guid",
- "Genres"
+ "Genres",
+ "ParentId",
+ "Audio",
+ "ExternalServiceId"
};
private readonly string[] _mediaStreamSaveColumns =
@@ -403,7 +409,9 @@ namespace MediaBrowser.Server.Implementations.Persistence
"DateLastSaved",
"IsInMixedFolder",
"LockedFields",
- "Studios"
+ "Studios",
+ "Audio",
+ "ExternalServiceId"
};
_saveItemCommand = _connection.CreateCommand();
_saveItemCommand.CommandText = "replace into TypedBaseItems (" + string.Join(",", saveColumns.ToArray()) + ") values (";
@@ -637,6 +645,25 @@ namespace MediaBrowser.Server.Implementations.Persistence
_saveItemCommand.GetParameter(index++).Value = string.Join("|", item.LockedFields.Select(i => i.ToString()).ToArray());
_saveItemCommand.GetParameter(index++).Value = string.Join("|", item.Studios.ToArray());
+ if (item.Audio.HasValue)
+ {
+ _saveItemCommand.GetParameter(index++).Value = item.Audio.Value.ToString();
+ }
+ else
+ {
+ _saveItemCommand.GetParameter(index++).Value = null;
+ }
+
+ var tvItem = item as ILiveTvItem;
+ if (tvItem != null)
+ {
+ _saveItemCommand.GetParameter(index++).Value = tvItem.ServiceName;
+ }
+ else
+ {
+ _saveItemCommand.GetParameter(index++).Value = null;
+ }
+
_saveItemCommand.Transaction = transaction;
_saveItemCommand.ExecuteNonQuery();
@@ -940,6 +967,25 @@ namespace MediaBrowser.Server.Implementations.Persistence
item.Genres = reader.GetString(40).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToList();
}
+ if (!reader.IsDBNull(41))
+ {
+ item.ParentId = reader.GetGuid(41);
+ }
+
+ if (!reader.IsDBNull(42))
+ {
+ item.Audio = (ProgramAudio)Enum.Parse(typeof(ProgramAudio), reader.GetString(42), true);
+ }
+
+ if (!reader.IsDBNull(43))
+ {
+ var tvItem = item as ILiveTvItem;
+ if (tvItem != null)
+ {
+ item.ForcedSortName = reader.GetString(43);
+ }
+ }
+
return item;
}
@@ -1668,6 +1714,12 @@ namespace MediaBrowser.Server.Implementations.Persistence
cmd.Parameters.Add(cmd, "@MinStartDate", DbType.Date).Value = query.MinStartDate.Value;
}
+ if (query.MinPremiereDate.HasValue)
+ {
+ whereClauses.Add("PremiereDate>=@MinPremiereDate");
+ cmd.Parameters.Add(cmd, "@MinPremiereDate", DbType.Date).Value = query.MinPremiereDate.Value;
+ }
+
if (query.MaxStartDate.HasValue)
{
whereClauses.Add("StartDate<=@MaxStartDate");
diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs
index e7853b4580..a63b93dc78 100644
--- a/MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs
+++ b/MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs
@@ -47,7 +47,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
string[] queries = {
- "create table if not exists MetadataStatus (ItemId GUID PRIMARY KEY, ItemName TEXT, ItemType TEXT, SeriesName TEXT, DateLastMetadataRefresh datetime, DateLastImagesRefresh datetime, LastErrorMessage TEXT, ItemDateModified DateTimeNull)",
+ "create table if not exists MetadataStatus (ItemId GUID PRIMARY KEY, ItemName TEXT, ItemType TEXT, SeriesName TEXT, DateLastMetadataRefresh datetime, DateLastImagesRefresh datetime, ItemDateModified DateTimeNull)",
"create index if not exists idx_MetadataStatus on MetadataStatus(ItemId)",
//pragmas
@@ -71,7 +71,6 @@ namespace MediaBrowser.Server.Implementations.Persistence
"SeriesName",
"DateLastMetadataRefresh",
"DateLastImagesRefresh",
- "LastErrorMessage",
"ItemDateModified"
};
@@ -185,12 +184,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
if (!reader.IsDBNull(6))
{
- result.LastErrorMessage = reader.GetString(6);
- }
-
- if (!reader.IsDBNull(7))
- {
- result.ItemDateModified = reader.GetDateTime(7).ToUniversalTime();
+ result.ItemDateModified = reader.GetDateTime(6).ToUniversalTime();
}
return result;
@@ -219,8 +213,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
_saveStatusCommand.GetParameter(3).Value = status.SeriesName;
_saveStatusCommand.GetParameter(4).Value = status.DateLastMetadataRefresh;
_saveStatusCommand.GetParameter(5).Value = status.DateLastImagesRefresh;
- _saveStatusCommand.GetParameter(6).Value = status.LastErrorMessage;
- _saveStatusCommand.GetParameter(7).Value = status.ItemDateModified;
+ _saveStatusCommand.GetParameter(6).Value = status.ItemDateModified;
_saveStatusCommand.Transaction = transaction;
diff --git a/MediaBrowser.Server.Implementations/TV/TVSeriesManager.cs b/MediaBrowser.Server.Implementations/TV/TVSeriesManager.cs
index f34b43e433..93ebd0a1cd 100644
--- a/MediaBrowser.Server.Implementations/TV/TVSeriesManager.cs
+++ b/MediaBrowser.Server.Implementations/TV/TVSeriesManager.cs
@@ -36,8 +36,22 @@ namespace MediaBrowser.Server.Implementations.TV
? new string[] { }
: new[] { request.ParentId };
- var items = GetAllLibraryItems(user, parentIds, i => i is Series)
- .Cast<Series>();
+ IEnumerable<Series> items;
+
+ if (parentIds.Length == 0)
+ {
+ items = _libraryManager.GetItems(new InternalItemsQuery(user)
+ {
+ IncludeItemTypes = new[] { typeof(Series).Name },
+ SortOrder = SortOrder.Ascending
+
+ }, user).Cast<Series>();
+ }
+ else
+ {
+ items = GetAllLibraryItems(user, parentIds, i => i is Series)
+ .Cast<Series>();
+ }
// Avoid implicitly captured closure
var episodes = GetNextUpEpisodes(request, user, items);
@@ -64,7 +78,7 @@ namespace MediaBrowser.Server.Implementations.TV
return GetResult(episodes, null, request);
}
- private IEnumerable<BaseItem> GetAllLibraryItems(User user, string[] parentIds, Func<BaseItem,bool> filter)
+ private IEnumerable<BaseItem> GetAllLibraryItems(User user, string[] parentIds, Func<BaseItem, bool> filter)
{
if (parentIds.Length > 0)
{