aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Emby.Drawing/Emby.Drawing.csproj2
-rw-r--r--Emby.Drawing/ImageMagick/ImageMagickEncoder.cs26
-rw-r--r--Emby.Drawing/ImageProcessor.cs2
-rw-r--r--Emby.Drawing/packages.config2
-rw-r--r--MediaBrowser.Api/Images/ImageService.cs2
-rw-r--r--MediaBrowser.Api/Movies/MoviesService.cs3
-rw-r--r--MediaBrowser.Api/TvShowsService.cs35
-rw-r--r--MediaBrowser.Common.Implementations/Logging/NlogManager.cs2
-rw-r--r--MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj6
-rw-r--r--MediaBrowser.Common.Implementations/Security/PluginSecurityManager.cs9
-rw-r--r--MediaBrowser.Common.Implementations/packages.config4
-rw-r--r--MediaBrowser.Common/MediaBrowser.Common.csproj1
-rw-r--r--MediaBrowser.Common/Security/PaymentRequiredException.cs8
-rw-r--r--MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs4
-rw-r--r--MediaBrowser.Controller/Entities/Audio/Audio.cs30
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs53
-rw-r--r--MediaBrowser.Controller/Entities/Book.cs11
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs2
-rw-r--r--MediaBrowser.Controller/Entities/Game.cs7
-rw-r--r--MediaBrowser.Controller/Entities/InternalItemsQuery.cs11
-rw-r--r--MediaBrowser.Controller/Entities/Photo.cs2
-rw-r--r--MediaBrowser.Controller/Entities/Studio.cs7
-rw-r--r--MediaBrowser.Controller/Entities/User.cs20
-rw-r--r--MediaBrowser.Controller/Entities/Video.cs6
-rw-r--r--MediaBrowser.Controller/Library/ILibraryManager.cs8
-rw-r--r--MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs1
-rw-r--r--MediaBrowser.Controller/LiveTv/LiveTvProgram.cs35
-rw-r--r--MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs1
-rw-r--r--MediaBrowser.Controller/MediaBrowser.Controller.csproj1
-rw-r--r--MediaBrowser.Controller/Net/PaymentRequiredException.cs15
-rw-r--r--MediaBrowser.Controller/Providers/MetadataStatus.cs14
-rw-r--r--MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs7
-rw-r--r--MediaBrowser.Model/Configuration/ServerConfiguration.cs18
-rw-r--r--MediaBrowser.Providers/Manager/MetadataService.cs22
-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/MediaStreamColumns.cs32
-rw-r--r--MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs183
-rw-r--r--MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs13
-rw-r--r--MediaBrowser.Server.Implementations/Persistence/SqliteUserRepository.cs7
-rw-r--r--MediaBrowser.Server.Implementations/TV/TVSeriesManager.cs20
-rw-r--r--MediaBrowser.Server.Startup.Common/ApplicationHost.cs2
-rw-r--r--MediaBrowser.ServerApplication/MainStartup.cs21
-rw-r--r--MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj5
-rw-r--r--MediaBrowser.ServerApplication/packages.config2
-rw-r--r--SharedVersion.cs4
51 files changed, 529 insertions, 219 deletions
diff --git a/Emby.Drawing/Emby.Drawing.csproj b/Emby.Drawing/Emby.Drawing.csproj
index e9911a12d..6cda8b5d0 100644
--- a/Emby.Drawing/Emby.Drawing.csproj
+++ b/Emby.Drawing/Emby.Drawing.csproj
@@ -37,7 +37,7 @@
</Reference>
<Reference Include="ImageMagickSharp, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
- <HintPath>..\packages\ImageMagickSharp.1.0.0.16\lib\net45\ImageMagickSharp.dll</HintPath>
+ <HintPath>..\packages\ImageMagickSharp.1.0.0.17\lib\net45\ImageMagickSharp.dll</HintPath>
</Reference>
<Reference Include="Patterns.Logging">
<HintPath>..\packages\Patterns.Logging.1.0.0.2\lib\portable-net45+sl4+wp71+win8+wpa81\Patterns.Logging.dll</HintPath>
diff --git a/Emby.Drawing/ImageMagick/ImageMagickEncoder.cs b/Emby.Drawing/ImageMagick/ImageMagickEncoder.cs
index ed0760ee3..d097c8da3 100644
--- a/Emby.Drawing/ImageMagick/ImageMagickEncoder.cs
+++ b/Emby.Drawing/ImageMagick/ImageMagickEncoder.cs
@@ -9,6 +9,7 @@ using System;
using System.IO;
using System.Linq;
using CommonIO;
+using MediaBrowser.Controller.Configuration;
namespace Emby.Drawing.ImageMagick
{
@@ -18,13 +19,15 @@ namespace Emby.Drawing.ImageMagick
private readonly IApplicationPaths _appPaths;
private readonly IHttpClient _httpClient;
private readonly IFileSystem _fileSystem;
+ private readonly IServerConfigurationManager _config;
- public ImageMagickEncoder(ILogger logger, IApplicationPaths appPaths, IHttpClient httpClient, IFileSystem fileSystem)
+ public ImageMagickEncoder(ILogger logger, IApplicationPaths appPaths, IHttpClient httpClient, IFileSystem fileSystem, IServerConfigurationManager config)
{
_logger = logger;
_appPaths = appPaths;
_httpClient = httpClient;
_fileSystem = fileSystem;
+ _config = config;
LogVersion();
}
@@ -133,15 +136,19 @@ namespace Emby.Drawing.ImageMagick
public void EncodeImage(string inputPath, string outputPath, int width, int height, int quality, ImageProcessingOptions options)
{
+ // Even if the caller specified 100, don't use it because it takes forever
+ quality = Math.Min(quality, 99);
+
if (string.IsNullOrWhiteSpace(options.BackgroundColor) || !HasTransparency(inputPath))
{
using (var originalImage = new MagickWand(inputPath))
{
- originalImage.CurrentImage.ResizeImage(width, height);
+ ScaleImage(originalImage, width, height);
DrawIndicator(originalImage, width, height, options);
originalImage.CurrentImage.CompressionQuality = quality;
+ originalImage.CurrentImage.StripImage();
originalImage.SaveImage(outputPath);
}
@@ -152,12 +159,13 @@ namespace Emby.Drawing.ImageMagick
{
using (var originalImage = new MagickWand(inputPath))
{
- originalImage.CurrentImage.ResizeImage(width, height);
+ ScaleImage(originalImage, width, height);
wand.CurrentImage.CompositeImage(originalImage, CompositeOperator.OverCompositeOp, 0, 0);
DrawIndicator(wand, width, height, options);
wand.CurrentImage.CompressionQuality = quality;
+ wand.CurrentImage.StripImage();
wand.SaveImage(outputPath);
}
@@ -166,6 +174,18 @@ namespace Emby.Drawing.ImageMagick
SaveDelay();
}
+ private void ScaleImage(MagickWand wand, int width, int height)
+ {
+ if (_config.Configuration.EnableHighQualityImageScaling)
+ {
+ wand.CurrentImage.ResizeImage(width, height);
+ }
+ else
+ {
+ wand.CurrentImage.ScaleImage(width, height);
+ }
+ }
+
/// <summary>
/// Draws the indicator.
/// </summary>
diff --git a/Emby.Drawing/ImageProcessor.cs b/Emby.Drawing/ImageProcessor.cs
index ec5d66cba..a24987c05 100644
--- a/Emby.Drawing/ImageProcessor.cs
+++ b/Emby.Drawing/ImageProcessor.cs
@@ -224,7 +224,7 @@ namespace Emby.Drawing
return originalImagePath;
}
- var quality = options.Quality ?? 90;
+ var quality = options.Quality;
var outputFormat = GetOutputFormat(options.OutputFormat);
var cacheFilePath = GetCacheFilePath(originalImagePath, newSize, quality, dateModified, outputFormat, options.AddPlayedIndicator, options.PercentPlayed, options.UnplayedCount, options.BackgroundColor);
diff --git a/Emby.Drawing/packages.config b/Emby.Drawing/packages.config
index 0fcdc278e..3b8dbcab7 100644
--- a/Emby.Drawing/packages.config
+++ b/Emby.Drawing/packages.config
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="CommonIO" version="1.0.0.5" targetFramework="net45" />
- <package id="ImageMagickSharp" version="1.0.0.16" targetFramework="net45" />
+ <package id="ImageMagickSharp" version="1.0.0.17" targetFramework="net45" />
<package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" />
</packages> \ No newline at end of file
diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs
index 259789fd1..8114f9f22 100644
--- a/MediaBrowser.Api/Images/ImageService.cs
+++ b/MediaBrowser.Api/Images/ImageService.cs
@@ -623,7 +623,7 @@ namespace MediaBrowser.Api.Images
Item = item,
MaxHeight = request.MaxHeight,
MaxWidth = request.MaxWidth,
- Quality = request.Quality,
+ Quality = request.Quality ?? 100,
Width = request.Width,
AddPlayedIndicator = request.AddPlayedIndicator,
PercentPlayed = request.PercentPlayed ?? 0,
diff --git a/MediaBrowser.Api/Movies/MoviesService.cs b/MediaBrowser.Api/Movies/MoviesService.cs
index fe8bae1a5..1681c6fc6 100644
--- a/MediaBrowser.Api/Movies/MoviesService.cs
+++ b/MediaBrowser.Api/Movies/MoviesService.cs
@@ -379,9 +379,10 @@ namespace MediaBrowser.Api.Movies
{
foreach (var name in names)
{
- var itemsWithActor = _libraryManager.GetItemIds(new InternalItemsQuery
+ var itemsWithActor = _libraryManager.GetItemIds(new InternalItemsQuery(user)
{
Person = name
+
});
var items = allMovies
diff --git a/MediaBrowser.Api/TvShowsService.cs b/MediaBrowser.Api/TvShowsService.cs
index 29a4a8bb5..19d12fe65 100644
--- a/MediaBrowser.Api/TvShowsService.cs
+++ b/MediaBrowser.Api/TvShowsService.cs
@@ -159,7 +159,7 @@ namespace MediaBrowser.Api
[ApiMember(Name = "StartItemId", Description = "Optional. Skip through the list until a given item is found.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public string StartItemId { get; set; }
-
+
/// <summary>
/// Skips over a given number of items within the results. Use for paging.
/// </summary>
@@ -273,21 +273,32 @@ namespace MediaBrowser.Api
{
var user = _userManager.GetUserById(request.UserId);
- var items = GetAllLibraryItems(request.UserId, _userManager, _libraryManager, request.ParentId, i => i is Episode);
+ var minPremiereDate = DateTime.Now.Date.AddDays(-1).ToUniversalTime();
+
+ IEnumerable<BaseItem> items;
+
+ if (string.IsNullOrWhiteSpace(request.ParentId))
+ {
+ items = _libraryManager.GetItems(new InternalItemsQuery(user)
+ {
+ IncludeItemTypes = new[] { typeof(Episode).Name },
+ SortBy = new[] { "PremiereDate", "SortName" },
+ SortOrder = SortOrder.Ascending,
+ MinPremiereDate = minPremiereDate
+
+ }, user);
+ }
+ else
+ {
+ items = GetAllLibraryItems(request.UserId, _userManager, _libraryManager, request.ParentId, i => i is Episode && (i.PremiereDate ?? DateTime.MinValue) >= minPremiereDate);
+ }
var itemsList = _libraryManager
.Sort(items, user, new[] { "PremiereDate", "AirTime", "SortName" }, SortOrder.Ascending)
.Cast<Episode>()
.ToList();
- var unairedEpisodes = itemsList.Where(i => i.IsUnaired).ToList();
-
- var minPremiereDate = DateTime.Now.Date.AddDays(-1).ToUniversalTime();
- var previousEpisodes = itemsList.Where(i => !i.IsUnaired && (i.PremiereDate ?? DateTime.MinValue) >= minPremiereDate).ToList();
-
- previousEpisodes.AddRange(unairedEpisodes);
-
- var pagedItems = ApplyPaging(previousEpisodes, request.StartIndex, request.Limit);
+ var pagedItems = ApplyPaging(itemsList, request.StartIndex, request.Limit);
var options = GetDtoOptions(request);
@@ -440,7 +451,7 @@ namespace MediaBrowser.Api
}
episodes = season.GetEpisodes(user);
- }
+ }
else if (request.Season.HasValue)
{
var series = _libraryManager.GetItemById(request.Id) as Series;
@@ -495,7 +506,7 @@ namespace MediaBrowser.Api
.ToList();
var pagedItems = ApplyPaging(returnList, request.StartIndex, request.Limit);
-
+
var dtoOptions = GetDtoOptions(request);
var dtos = _dtoService.GetBaseItemDtos(pagedItems, dtoOptions, user)
diff --git a/MediaBrowser.Common.Implementations/Logging/NlogManager.cs b/MediaBrowser.Common.Implementations/Logging/NlogManager.cs
index 391e7c212..1bbcccd88 100644
--- a/MediaBrowser.Common.Implementations/Logging/NlogManager.cs
+++ b/MediaBrowser.Common.Implementations/Logging/NlogManager.cs
@@ -110,7 +110,7 @@ namespace MediaBrowser.Common.Implementations.Logging
var logFile = new FileTarget
{
FileName = path,
- Layout = "${longdate} ${level} - ${logger}: ${message}"
+ Layout = "${longdate} ${level} ${logger}: ${message}"
};
logFile.Name = "ApplicationLogFile";
diff --git a/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj b/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj
index d857e58b6..8615d4f8b 100644
--- a/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj
+++ b/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj
@@ -53,7 +53,7 @@
</Reference>
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
- <HintPath>..\packages\NLog.4.1.1\lib\net45\NLog.dll</HintPath>
+ <HintPath>..\packages\NLog.4.2.0\lib\net45\NLog.dll</HintPath>
</Reference>
<Reference Include="Patterns.Logging">
<HintPath>..\packages\Patterns.Logging.1.0.0.2\lib\portable-net45+sl4+wp71+win8+wpa81\Patterns.Logging.dll</HintPath>
@@ -62,9 +62,9 @@
<SpecificVersion>False</SpecificVersion>
<HintPath>..\ThirdParty\SharpCompress\SharpCompress.dll</HintPath>
</Reference>
- <Reference Include="SimpleInjector, Version=2.8.0.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
+ <Reference Include="SimpleInjector, Version=3.1.0.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
- <HintPath>..\packages\SimpleInjector.3.0.5\lib\net45\SimpleInjector.dll</HintPath>
+ <HintPath>..\packages\SimpleInjector.3.1.0\lib\net45\SimpleInjector.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
diff --git a/MediaBrowser.Common.Implementations/Security/PluginSecurityManager.cs b/MediaBrowser.Common.Implementations/Security/PluginSecurityManager.cs
index c17a637fe..7cc31ad7a 100644
--- a/MediaBrowser.Common.Implementations/Security/PluginSecurityManager.cs
+++ b/MediaBrowser.Common.Implementations/Security/PluginSecurityManager.cs
@@ -219,6 +219,10 @@ namespace MediaBrowser.Common.Implementations.Security
{
SupporterKey = reg.key;
}
+ else
+ {
+ throw new PaymentRequiredException();
+ }
}
}
@@ -227,6 +231,11 @@ namespace MediaBrowser.Common.Implementations.Security
SaveAppStoreInfo(parameters);
throw;
}
+ catch (PaymentRequiredException)
+ {
+ SaveAppStoreInfo(parameters);
+ throw;
+ }
catch (Exception e)
{
_logger.ErrorException("Error registering appstore purchase {0}", e, parameters ?? "NO PARMS SENT");
diff --git a/MediaBrowser.Common.Implementations/packages.config b/MediaBrowser.Common.Implementations/packages.config
index a0711a9c7..769a7c4f6 100644
--- a/MediaBrowser.Common.Implementations/packages.config
+++ b/MediaBrowser.Common.Implementations/packages.config
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="CommonIO" version="1.0.0.5" targetFramework="net45" />
- <package id="NLog" version="4.1.0" targetFramework="net45" />
+ <package id="NLog" version="4.2.0" targetFramework="net45" />
<package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" />
- <package id="SimpleInjector" version="3.0.5" targetFramework="net45" />
+ <package id="SimpleInjector" version="3.1.0" targetFramework="net45" />
</packages>
diff --git a/MediaBrowser.Common/MediaBrowser.Common.csproj b/MediaBrowser.Common/MediaBrowser.Common.csproj
index b2f62dd21..ccdb319fe 100644
--- a/MediaBrowser.Common/MediaBrowser.Common.csproj
+++ b/MediaBrowser.Common/MediaBrowser.Common.csproj
@@ -89,6 +89,7 @@
<Compile Include="ScheduledTasks\WeeklyTrigger.cs" />
<Compile Include="Security\IRequiresRegistration.cs" />
<Compile Include="Security\ISecurityManager.cs" />
+ <Compile Include="Security\PaymentRequiredException.cs" />
<Compile Include="Updates\IInstallationManager.cs" />
<Compile Include="Updates\InstallationEventArgs.cs" />
<Compile Include="Updates\InstallationFailedEventArgs.cs" />
diff --git a/MediaBrowser.Common/Security/PaymentRequiredException.cs b/MediaBrowser.Common/Security/PaymentRequiredException.cs
new file mode 100644
index 000000000..27b3e6961
--- /dev/null
+++ b/MediaBrowser.Common/Security/PaymentRequiredException.cs
@@ -0,0 +1,8 @@
+using System;
+
+namespace MediaBrowser.Common.Security
+{
+ public class PaymentRequiredException : Exception
+ {
+ }
+}
diff --git a/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs b/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs
index d8f5d52c3..e6bf86853 100644
--- a/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs
+++ b/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs
@@ -25,7 +25,7 @@ namespace MediaBrowser.Controller.Drawing
public int? MaxHeight { get; set; }
- public int? Quality { get; set; }
+ public int Quality { get; set; }
public List<IImageEnhancer> Enhancers { get; set; }
@@ -50,7 +50,7 @@ namespace MediaBrowser.Controller.Drawing
public bool HasDefaultOptionsWithoutSize(string originalImagePath)
{
- return (!Quality.HasValue || Quality.Value == 100) &&
+ return (Quality == 100) &&
IsOutputFormatDefault(originalImagePath) &&
!AddPlayedIndicator &&
PercentPlayed.Equals(0) &&
diff --git a/MediaBrowser.Controller/Entities/Audio/Audio.cs b/MediaBrowser.Controller/Entities/Audio/Audio.cs
index 43b980c20..6feffc3ef 100644
--- a/MediaBrowser.Controller/Entities/Audio/Audio.cs
+++ b/MediaBrowser.Controller/Entities/Audio/Audio.cs
@@ -27,9 +27,22 @@ namespace MediaBrowser.Controller.Entities.Audio
public long? Size { get; set; }
public string Container { get; set; }
public int? TotalBitrate { get; set; }
- public List<string> Tags { get; set; }
public ExtraType? ExtraType { get; set; }
+ /// <summary>
+ /// Gets or sets the artist.
+ /// </summary>
+ /// <value>The artist.</value>
+ public List<string> Artists { get; set; }
+
+ public List<string> AlbumArtists { get; set; }
+
+ /// <summary>
+ /// Gets or sets the album.
+ /// </summary>
+ /// <value>The album.</value>
+ public string Album { get; set; }
+
[IgnoreDataMember]
public bool IsThemeMedia
{
@@ -43,7 +56,6 @@ namespace MediaBrowser.Controller.Entities.Audio
{
Artists = new List<string>();
AlbumArtists = new List<string>();
- Tags = new List<string>();
}
[IgnoreDataMember]
@@ -92,14 +104,6 @@ namespace MediaBrowser.Controller.Entities.Audio
locationType != LocationType.Virtual;
}
- /// <summary>
- /// Gets or sets the artist.
- /// </summary>
- /// <value>The artist.</value>
- public List<string> Artists { get; set; }
-
- public List<string> AlbumArtists { get; set; }
-
[IgnoreDataMember]
public List<string> AllArtists
{
@@ -114,12 +118,6 @@ namespace MediaBrowser.Controller.Entities.Audio
}
}
- /// <summary>
- /// Gets or sets the album.
- /// </summary>
- /// <value>The album.</value>
- public string Album { get; set; }
-
[IgnoreDataMember]
public MusicAlbum AlbumEntity
{
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index ec688bd9f..fdf035e8d 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -24,6 +24,7 @@ using System.Runtime.Serialization;
using System.Threading;
using System.Threading.Tasks;
using CommonIO;
+using MediaBrowser.Model.LiveTv;
namespace MediaBrowser.Controller.Entities
{
@@ -34,6 +35,7 @@ namespace MediaBrowser.Controller.Entities
{
protected BaseItem()
{
+ Tags = new List<string>();
Genres = new List<string>();
Studios = new List<string>();
ProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
@@ -103,7 +105,8 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the name.
/// </summary>
/// <value>The name.</value>
- public string Name
+ [IgnoreDataMember]
+ public virtual string Name
{
get
{
@@ -122,15 +125,24 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the id.
/// </summary>
/// <value>The id.</value>
+ [IgnoreDataMember]
public Guid Id { get; set; }
/// <summary>
/// Gets or sets a value indicating whether this instance is hd.
/// </summary>
/// <value><c>true</c> if this instance is hd; otherwise, <c>false</c>.</value>
+ [IgnoreDataMember]
public bool? IsHD { get; set; }
/// <summary>
+ /// Gets or sets the audio.
+ /// </summary>
+ /// <value>The audio.</value>
+ [IgnoreDataMember]
+ public ProgramAudio? Audio { get; set; }
+
+ /// <summary>
/// Return the id that should be used to key display prefs for this item.
/// Default is based on the type for everything except actual generic folders.
/// </summary>
@@ -149,6 +161,7 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the path.
/// </summary>
/// <value>The path.</value>
+ [IgnoreDataMember]
public virtual string Path { get; set; }
[IgnoreDataMember]
@@ -173,7 +186,7 @@ namespace MediaBrowser.Controller.Entities
}
/// <summary>
- /// Id of the program.
+ /// If this content came from an external service, the id of the content on that service
/// </summary>
[IgnoreDataMember]
public string ExternalId
@@ -325,12 +338,14 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the date created.
/// </summary>
/// <value>The date created.</value>
+ [IgnoreDataMember]
public DateTime DateCreated { get; set; }
/// <summary>
/// Gets or sets the date modified.
/// </summary>
/// <value>The date modified.</value>
+ [IgnoreDataMember]
public DateTime DateModified { get; set; }
public DateTime DateLastSaved { get; set; }
@@ -407,6 +422,7 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the name of the forced sort.
/// </summary>
/// <value>The name of the forced sort.</value>
+ [IgnoreDataMember]
public string ForcedSortName
{
get { return _forcedSortName; }
@@ -493,6 +509,7 @@ namespace MediaBrowser.Controller.Entities
return sortable;
}
+ [IgnoreDataMember]
public Guid ParentId { get; set; }
/// <summary>
@@ -559,6 +576,7 @@ namespace MediaBrowser.Controller.Entities
/// When the item first debuted. For movies this could be premiere date, episodes would be first aired
/// </summary>
/// <value>The premiere date.</value>
+ [IgnoreDataMember]
public DateTime? PremiereDate { get; set; }
/// <summary>
@@ -572,31 +590,35 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the display type of the media.
/// </summary>
/// <value>The display type of the media.</value>
+ [IgnoreDataMember]
public string DisplayMediaType { get; set; }
/// <summary>
/// Gets or sets the official rating.
/// </summary>
/// <value>The official rating.</value>
+ [IgnoreDataMember]
public string OfficialRating { get; set; }
/// <summary>
/// Gets or sets the official rating description.
/// </summary>
/// <value>The official rating description.</value>
+ [IgnoreDataMember]
public string OfficialRatingDescription { get; set; }
/// <summary>
/// Gets or sets the custom rating.
/// </summary>
/// <value>The custom rating.</value>
- //[IgnoreDataMember]
+ [IgnoreDataMember]
public string CustomRating { get; set; }
/// <summary>
/// Gets or sets the overview.
/// </summary>
/// <value>The overview.</value>
+ [IgnoreDataMember]
public string Overview { get; set; }
/// <summary>
@@ -609,37 +631,48 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the genres.
/// </summary>
/// <value>The genres.</value>
+ [IgnoreDataMember]
public List<string> Genres { get; set; }
/// <summary>
+ /// Gets or sets the tags.
+ /// </summary>
+ /// <value>The tags.</value>
+ public List<string> Tags { get; set; }
+
+ /// <summary>
/// Gets or sets the home page URL.
/// </summary>
/// <value>The home page URL.</value>
+ [IgnoreDataMember]
public string HomePageUrl { get; set; }
/// <summary>
/// Gets or sets the community rating.
/// </summary>
/// <value>The community rating.</value>
- //[IgnoreDataMember]
+ [IgnoreDataMember]
public float? CommunityRating { get; set; }
/// <summary>
/// Gets or sets the community rating vote count.
/// </summary>
/// <value>The community rating vote count.</value>
+ [IgnoreDataMember]
public int? VoteCount { get; set; }
/// <summary>
/// Gets or sets the run time ticks.
/// </summary>
/// <value>The run time ticks.</value>
+ [IgnoreDataMember]
public long? RunTimeTicks { get; set; }
/// <summary>
/// Gets or sets the production year.
/// </summary>
/// <value>The production year.</value>
+ [IgnoreDataMember]
public int? ProductionYear { get; set; }
/// <summary>
@@ -647,13 +680,14 @@ namespace MediaBrowser.Controller.Entities
/// This could be episode number, album track number, etc.
/// </summary>
/// <value>The index number.</value>
- //[IgnoreDataMember]
+ [IgnoreDataMember]
public int? IndexNumber { get; set; }
/// <summary>
/// For an episode this could be the season number, or for a song this could be the disc number.
/// </summary>
/// <value>The parent index number.</value>
+ [IgnoreDataMember]
public int? ParentIndexNumber { get; set; }
[IgnoreDataMember]
@@ -1308,15 +1342,6 @@ namespace MediaBrowser.Controller.Entities
}
/// <summary>
- /// Adds a person to the item
- /// </summary>
- /// <param name="person">The person.</param>
- /// <exception cref="System.ArgumentNullException"></exception>
- public void AddPerson(PersonInfo person)
- {
- }
-
- /// <summary>
/// Adds a studio to the item
/// </summary>
/// <param name="name">The name.</param>
diff --git a/MediaBrowser.Controller/Entities/Book.cs b/MediaBrowser.Controller/Entities/Book.cs
index d31675baf..8342c1c10 100644
--- a/MediaBrowser.Controller/Entities/Book.cs
+++ b/MediaBrowser.Controller/Entities/Book.cs
@@ -17,19 +17,8 @@ namespace MediaBrowser.Controller.Entities
}
}
- /// <summary>
- /// Gets or sets the tags.
- /// </summary>
- /// <value>The tags.</value>
- public List<string> Tags { get; set; }
-
public string SeriesName { get; set; }
- public Book()
- {
- Tags = new List<string>();
- }
-
public override bool CanDownload()
{
var locationType = LocationType;
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs
index 05965e1b5..fcbe54d05 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -28,7 +28,6 @@ namespace MediaBrowser.Controller.Entities
public List<Guid> ThemeSongIds { get; set; }
public List<Guid> ThemeVideoIds { get; set; }
- public List<string> Tags { get; set; }
public Folder()
{
@@ -36,7 +35,6 @@ namespace MediaBrowser.Controller.Entities
ThemeSongIds = new List<Guid>();
ThemeVideoIds = new List<Guid>();
- Tags = new List<string>();
}
[IgnoreDataMember]
diff --git a/MediaBrowser.Controller/Entities/Game.cs b/MediaBrowser.Controller/Entities/Game.cs
index ed3e85d58..ea518ce35 100644
--- a/MediaBrowser.Controller/Entities/Game.cs
+++ b/MediaBrowser.Controller/Entities/Game.cs
@@ -21,7 +21,6 @@ namespace MediaBrowser.Controller.Entities
RemoteTrailerIds = new List<Guid>();
ThemeSongIds = new List<Guid>();
ThemeVideoIds = new List<Guid>();
- Tags = new List<string>();
}
public List<Guid> LocalTrailerIds { get; set; }
@@ -35,12 +34,6 @@ namespace MediaBrowser.Controller.Entities
}
/// <summary>
- /// Gets or sets the tags.
- /// </summary>
- /// <value>The tags.</value>
- public List<string> Tags { get; set; }
-
- /// <summary>
/// Gets or sets the remote trailers.
/// </summary>
/// <value>The remote trailers.</value>
diff --git a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
index 785e2fd2b..786c96d36 100644
--- a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
+++ b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
@@ -75,6 +75,7 @@ namespace MediaBrowser.Controller.Entities
public string[] Tags { get; set; }
public string[] OfficialRatings { get; set; }
+ public DateTime? MinPremiereDate { get; set; }
public DateTime? MinStartDate { get; set; }
public DateTime? MaxStartDate { get; set; }
public DateTime? MinEndDate { get; set; }
@@ -121,5 +122,15 @@ namespace MediaBrowser.Controller.Entities
ChannelIds = new string[] { };
ItemIds = new string[] { };
}
+
+ public InternalItemsQuery(User user)
+ : this()
+ {
+ if (user != null)
+ {
+ var policy = user.Policy;
+ MaxParentalRating = policy.MaxParentalRating;
+ }
+ }
}
}
diff --git a/MediaBrowser.Controller/Entities/Photo.cs b/MediaBrowser.Controller/Entities/Photo.cs
index a3d892181..6c2f2a326 100644
--- a/MediaBrowser.Controller/Entities/Photo.cs
+++ b/MediaBrowser.Controller/Entities/Photo.cs
@@ -9,12 +9,10 @@ namespace MediaBrowser.Controller.Entities
{
public class Photo : BaseItem, IHasTags, IHasTaglines
{
- public List<string> Tags { get; set; }
public List<string> Taglines { get; set; }
public Photo()
{
- Tags = new List<string>();
Taglines = new List<string>();
}
diff --git a/MediaBrowser.Controller/Entities/Studio.cs b/MediaBrowser.Controller/Entities/Studio.cs
index 822f305ed..a55527f37 100644
--- a/MediaBrowser.Controller/Entities/Studio.cs
+++ b/MediaBrowser.Controller/Entities/Studio.cs
@@ -10,13 +10,6 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
public class Studio : BaseItem, IItemByName, IHasTags
{
- public List<string> Tags { get; set; }
-
- public Studio()
- {
- Tags = new List<string>();
- }
-
/// <summary>
/// Gets the user data key.
/// </summary>
diff --git a/MediaBrowser.Controller/Entities/User.cs b/MediaBrowser.Controller/Entities/User.cs
index a9e314ede..3900f0805 100644
--- a/MediaBrowser.Controller/Entities/User.cs
+++ b/MediaBrowser.Controller/Entities/User.cs
@@ -58,6 +58,26 @@ namespace MediaBrowser.Controller.Entities
}
}
+ private string _name;
+ /// <summary>
+ /// Gets or sets the name.
+ /// </summary>
+ /// <value>The name.</value>
+ public override string Name
+ {
+ get
+ {
+ return _name;
+ }
+ set
+ {
+ _name = value;
+
+ // lazy load this again
+ SortName = null;
+ }
+ }
+
/// <summary>
/// Returns the folder containing the item.
/// If the item is a folder, it returns the folder itself
diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs
index 8beee79bf..62d1bc7a1 100644
--- a/MediaBrowser.Controller/Entities/Video.cs
+++ b/MediaBrowser.Controller/Entities/Video.cs
@@ -186,12 +186,6 @@ namespace MediaBrowser.Controller.Entities
public string ShortcutPath { get; set; }
/// <summary>
- /// Gets or sets the tags.
- /// </summary>
- /// <value>The tags.</value>
- public List<string> Tags { get; set; }
-
- /// <summary>
/// Gets or sets the video bit rate.
/// </summary>
/// <value>The video bit rate.</value>
diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs
index c7ab88524..96bb6e2b6 100644
--- a/MediaBrowser.Controller/Library/ILibraryManager.cs
+++ b/MediaBrowser.Controller/Library/ILibraryManager.cs
@@ -543,5 +543,13 @@ namespace MediaBrowser.Controller.Library
/// <param name="imageIndex">Index of the image.</param>
/// <returns>Task.</returns>
Task<ItemImageInfo> ConvertImageToLocal(IHasImages item, ItemImageInfo image, int imageIndex);
+
+ /// <summary>
+ /// Gets the items.
+ /// </summary>
+ /// <param name="query">The query.</param>
+ /// <param name="user">The user.</param>
+ /// <returns>List&lt;BaseItem&gt;.</returns>
+ IEnumerable<BaseItem> GetItems(InternalItemsQuery query, User user);
}
} \ No newline at end of file
diff --git a/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs b/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs
index 03c05ec69..dd6a53d45 100644
--- a/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs
+++ b/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs
@@ -36,7 +36,6 @@ namespace MediaBrowser.Controller.LiveTv
public bool IsLive { get; set; }
[IgnoreDataMember]
public bool IsPremiere { get; set; }
- public ProgramAudio? Audio { get; set; }
/// <summary>
/// Gets the user data key.
diff --git a/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs b/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs
index e4b52fd99..aa1a3b9c2 100644
--- a/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs
+++ b/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs
@@ -32,10 +32,11 @@ namespace MediaBrowser.Controller.LiveTv
}
/// <summary>
- /// Gets or sets the type of the channel.
+ /// Gets or sets the name.
/// </summary>
- /// <value>The type of the channel.</value>
- public ChannelType ChannelType { get; set; }
+ /// <value>The name.</value>
+ [IgnoreDataMember]
+ public string ServiceName { get; set; }
/// <summary>
/// The start date of the program, in UTC.
@@ -44,12 +45,6 @@ namespace MediaBrowser.Controller.LiveTv
public DateTime StartDate { get; set; }
/// <summary>
- /// Gets or sets the audio.
- /// </summary>
- /// <value>The audio.</value>
- public ProgramAudio? Audio { get; set; }
-
- /// <summary>
/// Gets or sets a value indicating whether this instance is repeat.
/// </summary>
/// <value><c>true</c> if this instance is repeat; otherwise, <c>false</c>.</value>
@@ -64,12 +59,6 @@ namespace MediaBrowser.Controller.LiveTv
public string EpisodeTitle { get; set; }
/// <summary>
- /// Gets or sets the name of the service.
- /// </summary>
- /// <value>The name of the service.</value>
- public string ServiceName { get; set; }
-
- /// <summary>
/// Gets or sets a value indicating whether this instance is movie.
/// </summary>
/// <value><c>true</c> if this instance is movie; otherwise, <c>false</c>.</value>
@@ -145,14 +134,14 @@ namespace MediaBrowser.Controller.LiveTv
}
}
- [IgnoreDataMember]
- public override string MediaType
- {
- get
- {
- return ChannelType == ChannelType.TV ? Model.Entities.MediaType.Video : Model.Entities.MediaType.Audio;
- }
- }
+ //[IgnoreDataMember]
+ //public override string MediaType
+ //{
+ // get
+ // {
+ // return ChannelType == ChannelType.TV ? Model.Entities.MediaType.Video : Model.Entities.MediaType.Audio;
+ // }
+ //}
[IgnoreDataMember]
public bool IsAiring
diff --git a/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs b/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs
index 77404cfe8..de8764e6d 100644
--- a/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs
+++ b/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs
@@ -36,7 +36,6 @@ namespace MediaBrowser.Controller.LiveTv
public bool IsLive { get; set; }
[IgnoreDataMember]
public bool IsPremiere { get; set; }
- public ProgramAudio? Audio { get; set; }
/// <summary>
/// Gets the user data key.
diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
index bcf4de2a2..600674114 100644
--- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj
+++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
@@ -248,6 +248,7 @@
<Compile Include="Net\IWebSocketConnection.cs" />
<Compile Include="Net\IWebSocketListener.cs" />
<Compile Include="Net\LoggedAttribute.cs" />
+ <Compile Include="Net\PaymentRequiredException.cs" />
<Compile Include="Net\SecurityException.cs" />
<Compile Include="Net\ServiceStackServiceRequest.cs" />
<Compile Include="Net\StaticResultOptions.cs" />
diff --git a/MediaBrowser.Controller/Net/PaymentRequiredException.cs b/MediaBrowser.Controller/Net/PaymentRequiredException.cs
new file mode 100644
index 000000000..e09fe092e
--- /dev/null
+++ b/MediaBrowser.Controller/Net/PaymentRequiredException.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Controller.Net
+{
+ /// <summary>
+ /// Corresponds to a 402 response code
+ /// </summary>
+ public class PaymentRequiredException : Exception
+ {
+ }
+}
diff --git a/MediaBrowser.Controller/Providers/MetadataStatus.cs b/MediaBrowser.Controller/Providers/MetadataStatus.cs
index 9b946aee2..654d72e2a 100644
--- a/MediaBrowser.Controller/Providers/MetadataStatus.cs
+++ b/MediaBrowser.Controller/Providers/MetadataStatus.cs
@@ -40,22 +40,8 @@ namespace MediaBrowser.Controller.Providers
/// <value>The date last images refresh.</value>
public DateTime? DateLastImagesRefresh { get; set; }
- /// <summary>
- /// Gets or sets the last result error message.
- /// </summary>
- /// <value>The last result error message.</value>
- public string LastErrorMessage { get; set; }
-
public DateTime? ItemDateModified { get; set; }
- public void AddStatus(string errorMessage)
- {
- if (string.IsNullOrEmpty(LastErrorMessage))
- {
- LastErrorMessage = errorMessage;
- }
- }
-
public bool IsDirty { get; private set; }
public void SetDateLastMetadataRefresh(DateTime? date)
diff --git a/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs b/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs
index 7e9fa151b..56ce6b6d6 100644
--- a/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs
+++ b/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs
@@ -130,13 +130,18 @@ namespace MediaBrowser.MediaEncoding.Probing
var stream = new MediaStream
{
Codec = streamInfo.codec_name,
- CodecTag = streamInfo.codec_tag_string,
Profile = streamInfo.profile,
Level = streamInfo.level,
Index = streamInfo.index,
PixelFormat = streamInfo.pix_fmt
};
+ // Filter out junk
+ if (!string.IsNullOrWhiteSpace(streamInfo.codec_tag_string) && streamInfo.codec_tag_string.IndexOf("[0]", StringComparison.OrdinalIgnoreCase) == -1)
+ {
+ stream.CodecTag = streamInfo.codec_tag_string;
+ }
+
if (streamInfo.tags != null)
{
stream.Language = GetDictionaryValue(streamInfo.tags, "language");
diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs
index dfcafa32d..e4c4e4762 100644
--- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs
+++ b/MediaBrowser.Model/Configuration/ServerConfiguration.cs
@@ -63,6 +63,12 @@ namespace MediaBrowser.Model.Configuration
public bool IsPortAuthorized { get; set; }
/// <summary>
+ /// Gets or sets a value indicating whether [enable high quality image scaling].
+ /// </summary>
+ /// <value><c>true</c> if [enable high quality image scaling]; otherwise, <c>false</c>.</value>
+ public bool EnableHighQualityImageScaling { get; set; }
+
+ /// <summary>
/// Gets or sets the item by name path.
/// </summary>
/// <value>The item by name path.</value>
@@ -93,18 +99,18 @@ namespace MediaBrowser.Model.Configuration
public bool EnableLocalizedGuids { get; set; }
/// <summary>
- /// Gets or sets a value indicating whether [disable startup scan].
- /// </summary>
- /// <value><c>true</c> if [disable startup scan]; otherwise, <c>false</c>.</value>
- public bool DisableStartupScan { get; set; }
-
- /// <summary>
/// Gets or sets a value indicating whether [enable user views].
/// </summary>
/// <value><c>true</c> if [enable user views]; otherwise, <c>false</c>.</value>
public bool EnableUserViews { get; set; }
/// <summary>
+ /// Gets or sets a value indicating whether [disable startup scan].
+ /// </summary>
+ /// <value><c>true</c> if [disable startup scan]; otherwise, <c>false</c>.</value>
+ public bool DisableStartupScan { get; set; }
+
+ /// <summary>
/// Gets or sets a value indicating whether [enable library metadata sub folder].
/// </summary>
/// <value><c>true</c> if [enable library metadata sub folder]; otherwise, <c>false</c>.</value>
diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs
index 6860aeff3..a7f58e32b 100644
--- a/MediaBrowser.Providers/Manager/MetadataService.cs
+++ b/MediaBrowser.Providers/Manager/MetadataService.cs
@@ -99,7 +99,6 @@ namespace MediaBrowser.Providers.Manager
var updateType = ItemUpdateType.None;
var refreshResult = GetLastResult(item);
- refreshResult.LastErrorMessage = string.Empty;
var itemImageProvider = new ItemImageProvider(Logger, ProviderManager, ServerConfigurationManager, FileSystem);
var localImagesFailed = false;
@@ -119,7 +118,6 @@ namespace MediaBrowser.Providers.Manager
{
localImagesFailed = true;
Logger.ErrorException("Error validating images for {0}", ex, item.Path ?? item.Name ?? "Unknown name");
- refreshResult.AddStatus(ex.Message);
}
var metadataResult = new MetadataResult<TItemType>
@@ -150,7 +148,6 @@ namespace MediaBrowser.Providers.Manager
var result = await RefreshWithProviders(metadataResult, id, refreshOptions, providers, itemImageProvider, cancellationToken).ConfigureAwait(false);
updateType = updateType | result.UpdateType;
- refreshResult.AddStatus(result.ErrorMessage);
if (result.Failures == 0)
{
refreshResult.SetDateLastMetadataRefresh(DateTime.UtcNow);
@@ -172,7 +169,6 @@ namespace MediaBrowser.Providers.Manager
var result = await itemImageProvider.RefreshImages(itemOfType, providers, refreshOptions, config, cancellationToken).ConfigureAwait(false);
updateType = updateType | result.UpdateType;
- refreshResult.AddStatus(result.ErrorMessage);
if (result.Failures == 0)
{
refreshResult.SetDateLastImagesRefresh(DateTime.UtcNow);
@@ -231,22 +227,32 @@ namespace MediaBrowser.Providers.Manager
private DateTime GetLastRefreshDate(IHasMetadata item)
{
- if (item.DateLastRefreshed != default(DateTime))
+ if (EnableDateLastRefreshed(item))
{
return item.DateLastRefreshed;
}
+ return item.DateLastSaved;
+ }
+
+ private bool EnableDateLastRefreshed(IHasMetadata item)
+ {
if (ServerConfigurationManager.Configuration.EnableDateLastRefresh)
{
- return item.DateLastRefreshed;
+ return true;
+ }
+
+ if (item.DateLastRefreshed != default(DateTime))
+ {
+ return true;
}
if (item is BoxSet || (item is IItemByName && !(item is MusicArtist)))
{
- return item.DateLastRefreshed;
+ return true;
}
- return item.DateLastSaved;
+ return false;
}
protected async Task SaveItem(MetadataResult<TItemType> result, ItemUpdateType reason, CancellationToken cancellationToken)
diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs
index 20e1eb543..fcda802f4 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 e8bb40ba1..6abfa0674 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 02ce38ef1..fae702023 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 f8178c115..9f80c8ac9 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 92acd08d1..daa3d8ad4 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 d6aff1192..108a891e0 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 edfca0d6c..d7c9edae3 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/MediaStreamColumns.cs b/MediaBrowser.Server.Implementations/Persistence/MediaStreamColumns.cs
index f54e702d6..c983dd547 100644
--- a/MediaBrowser.Server.Implementations/Persistence/MediaStreamColumns.cs
+++ b/MediaBrowser.Server.Implementations/Persistence/MediaStreamColumns.cs
@@ -27,6 +27,38 @@ namespace MediaBrowser.Server.Implementations.Persistence
AddIsCabacColumn();
AddKeyFramesColumn();
AddRefFramesCommand();
+ AddCodecTagColumn();
+ }
+
+ private void AddCodecTagColumn()
+ {
+ using (var cmd = _connection.CreateCommand())
+ {
+ cmd.CommandText = "PRAGMA table_info(mediastreams)";
+
+ using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult))
+ {
+ while (reader.Read())
+ {
+ if (!reader.IsDBNull(1))
+ {
+ var name = reader.GetString(1);
+
+ if (string.Equals(name, "CodecTag", StringComparison.OrdinalIgnoreCase))
+ {
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ var builder = new StringBuilder();
+
+ builder.AppendLine("alter table mediastreams");
+ builder.AppendLine("add column CodecTag TEXT");
+
+ _connection.RunQueries(new[] { builder.ToString() }, _logger);
}
private void AddPixelFormatColumnCommand()
diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
index dcf94f737..167c96185 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 = 13;
+ private const int LatestSchemaVersion = 17;
/// <summary>
/// Initializes a new instance of the <see cref="SqliteItemRepository"/> class.
@@ -121,7 +122,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
_connection = await SqliteExtensions.ConnectToDb(dbFile, _logger).ConfigureAwait(false);
var createMediaStreamsTableCommand
- = "create table if not exists mediastreams (ItemId GUID, StreamIndex INT, StreamType TEXT, Codec TEXT, Language TEXT, ChannelLayout TEXT, Profile TEXT, AspectRatio TEXT, Path TEXT, IsInterlaced BIT, BitRate INT NULL, Channels INT NULL, SampleRate INT NULL, IsDefault BIT, IsForced BIT, IsExternal BIT, Height INT NULL, Width INT NULL, AverageFrameRate FLOAT NULL, RealFrameRate FLOAT NULL, Level FLOAT NULL, PixelFormat TEXT, BitDepth INT NULL, IsAnamorphic BIT NULL, RefFrames INT NULL, IsCabac BIT NULL, KeyFrames TEXT NULL, PRIMARY KEY (ItemId, StreamIndex))";
+ = "create table if not exists mediastreams (ItemId GUID, StreamIndex INT, StreamType TEXT, Codec TEXT, Language TEXT, ChannelLayout TEXT, Profile TEXT, AspectRatio TEXT, Path TEXT, IsInterlaced BIT, BitRate INT NULL, Channels INT NULL, SampleRate INT NULL, IsDefault BIT, IsForced BIT, IsExternal BIT, Height INT NULL, Width INT NULL, AverageFrameRate FLOAT NULL, RealFrameRate FLOAT NULL, Level FLOAT NULL, PixelFormat TEXT, BitDepth INT NULL, IsAnamorphic BIT NULL, RefFrames INT NULL, IsCabac BIT NULL, KeyFrames TEXT NULL, CodecTag TEXT NULL, PRIMARY KEY (ItemId, StreamIndex))";
string[] queries = {
@@ -198,6 +199,13 @@ namespace MediaBrowser.Server.Implementations.Persistence
_connection.AddColumn(_logger, "TypedBaseItems", "ExternalEtag", "Text");
_connection.AddColumn(_logger, "TypedBaseItems", "DateLastRefreshed", "DATETIME");
+ _connection.AddColumn(_logger, "TypedBaseItems", "DateLastSaved", "DATETIME");
+ _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();
@@ -307,7 +315,27 @@ namespace MediaBrowser.Server.Implementations.Persistence
"PreferredMetadataCountryCode",
"IsHD",
"ExternalEtag",
- "DateLastRefreshed"
+ "DateLastRefreshed",
+ "Name",
+ "Path",
+ "PremiereDate",
+ "Overview",
+ "ParentIndexNumber",
+ "ProductionYear",
+ "OfficialRating",
+ "OfficialRatingDescription",
+ "HomePageUrl",
+ "DisplayMediaType",
+ "ForcedSortName",
+ "RunTimeTicks",
+ "VoteCount",
+ "DateCreated",
+ "DateModified",
+ "guid",
+ "Genres",
+ "ParentId",
+ "Audio",
+ "ExternalServiceId"
};
private readonly string[] _mediaStreamSaveColumns =
@@ -338,7 +366,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
"IsAnamorphic",
"RefFrames",
"IsCabac",
- "KeyFrames"
+ "KeyFrames",
+ "CodecTag"
};
/// <summary>
@@ -394,7 +423,13 @@ namespace MediaBrowser.Server.Implementations.Persistence
"PreferredMetadataCountryCode",
"IsHD",
"ExternalEtag",
- "DateLastRefreshed"
+ "DateLastRefreshed",
+ "DateLastSaved",
+ "IsInMixedFolder",
+ "LockedFields",
+ "Studios",
+ "Audio",
+ "ExternalServiceId"
};
_saveItemCommand = _connection.CreateCommand();
_saveItemCommand.CommandText = "replace into TypedBaseItems (" + string.Join(",", saveColumns.ToArray()) + ") values (";
@@ -623,6 +658,30 @@ namespace MediaBrowser.Server.Implementations.Persistence
_saveItemCommand.GetParameter(index++).Value = item.DateLastRefreshed;
}
+ _saveItemCommand.GetParameter(index++).Value = item.DateLastSaved;
+ _saveItemCommand.GetParameter(index++).Value = item.IsInMixedFolder;
+ _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();
@@ -844,6 +903,107 @@ namespace MediaBrowser.Server.Implementations.Persistence
item.DateLastRefreshed = reader.GetDateTime(23).ToUniversalTime();
}
+ if (!reader.IsDBNull(24))
+ {
+ item.Name = reader.GetString(24);
+ }
+
+ if (!reader.IsDBNull(25))
+ {
+ item.Path = reader.GetString(25);
+ }
+
+ if (!reader.IsDBNull(26))
+ {
+ item.PremiereDate = reader.GetDateTime(26).ToUniversalTime();
+ }
+
+ if (!reader.IsDBNull(27))
+ {
+ item.Overview = reader.GetString(27);
+ }
+
+ if (!reader.IsDBNull(28))
+ {
+ item.ParentIndexNumber = reader.GetInt32(28);
+ }
+
+ if (!reader.IsDBNull(29))
+ {
+ item.ProductionYear = reader.GetInt32(29);
+ }
+
+ if (!reader.IsDBNull(30))
+ {
+ item.OfficialRating = reader.GetString(30);
+ }
+
+ if (!reader.IsDBNull(31))
+ {
+ item.OfficialRating = reader.GetString(31);
+ }
+
+ if (!reader.IsDBNull(32))
+ {
+ item.HomePageUrl = reader.GetString(32);
+ }
+
+ if (!reader.IsDBNull(33))
+ {
+ item.DisplayMediaType = reader.GetString(33);
+ }
+
+ if (!reader.IsDBNull(34))
+ {
+ item.ForcedSortName = reader.GetString(34);
+ }
+
+ if (!reader.IsDBNull(35))
+ {
+ item.RunTimeTicks = reader.GetInt64(35);
+ }
+
+ if (!reader.IsDBNull(36))
+ {
+ item.VoteCount = reader.GetInt32(36);
+ }
+
+ if (!reader.IsDBNull(37))
+ {
+ item.DateCreated = reader.GetDateTime(37).ToUniversalTime();
+ }
+
+ if (!reader.IsDBNull(38))
+ {
+ item.DateModified = reader.GetDateTime(38).ToUniversalTime();
+ }
+
+ item.Id = reader.GetGuid(39);
+
+ if (!reader.IsDBNull(40))
+ {
+ 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;
}
@@ -1572,6 +1732,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");
@@ -2227,6 +2393,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
_saveStreamCommand.GetParameter(index++).Value = string.Join(",", stream.KeyFrames.Select(i => i.ToString(CultureInfo.InvariantCulture)).ToArray());
}
+ _saveStreamCommand.GetParameter(index++).Value = stream.CodecTag;
+
_saveStreamCommand.Transaction = transaction;
_saveStreamCommand.ExecuteNonQuery();
}
@@ -2388,6 +2556,11 @@ namespace MediaBrowser.Server.Implementations.Persistence
}
}
+ if (!reader.IsDBNull(27))
+ {
+ item.CodecTag = reader.GetString(27);
+ }
+
return item;
}
diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs
index e7853b458..a63b93dc7 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/Persistence/SqliteUserRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteUserRepository.cs
index ad784ae5d..9bd7e47f3 100644
--- a/MediaBrowser.Server.Implementations/Persistence/SqliteUserRepository.cs
+++ b/MediaBrowser.Server.Implementations/Persistence/SqliteUserRepository.cs
@@ -144,15 +144,18 @@ namespace MediaBrowser.Server.Implementations.Persistence
{
using (var cmd = _connection.CreateCommand())
{
- cmd.CommandText = "select data from users";
+ cmd.CommandText = "select guid,data from users";
using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult))
{
while (reader.Read())
{
- using (var stream = reader.GetMemoryStream(0))
+ var id = reader.GetGuid(0);
+
+ using (var stream = reader.GetMemoryStream(1))
{
var user = _jsonSerializer.DeserializeFromStream<User>(stream);
+ user.Id = id;
yield return user;
}
}
diff --git a/MediaBrowser.Server.Implementations/TV/TVSeriesManager.cs b/MediaBrowser.Server.Implementations/TV/TVSeriesManager.cs
index f34b43e43..93ebd0a1c 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)
{
diff --git a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs
index aeafc1ede..97a457a1b 100644
--- a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs
+++ b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs
@@ -573,7 +573,7 @@ namespace MediaBrowser.Server.Startup.Common
{
try
{
- return new ImageMagickEncoder(LogManager.GetLogger("ImageMagick"), ApplicationPaths, HttpClient, FileSystemManager);
+ return new ImageMagickEncoder(LogManager.GetLogger("ImageMagick"), ApplicationPaths, HttpClient, FileSystemManager, ServerConfigurationManager);
}
catch (Exception ex)
{
diff --git a/MediaBrowser.ServerApplication/MainStartup.cs b/MediaBrowser.ServerApplication/MainStartup.cs
index b8af35fde..1032b1716 100644
--- a/MediaBrowser.ServerApplication/MainStartup.cs
+++ b/MediaBrowser.ServerApplication/MainStartup.cs
@@ -29,6 +29,7 @@ namespace MediaBrowser.ServerApplication
private static ILogger _logger;
private static bool _isRunningAsService = false;
+ private static bool _appHostDisposed;
/// <summary>
/// Defines the entry point of the application.
@@ -329,7 +330,7 @@ namespace MediaBrowser.ServerApplication
{
_logger.Info("Shutting down");
- _appHost.Dispose();
+ DisposeAppHost();
}
/// <summary>
@@ -500,14 +501,15 @@ namespace MediaBrowser.ServerApplication
}
else
{
+ DisposeAppHost();
+
ShutdownWindowsApplication();
}
}
public static void Restart()
{
- _logger.Info("Disposing app host");
- _appHost.Dispose();
+ DisposeAppHost();
if (!_isRunningAsService)
{
@@ -522,11 +524,24 @@ namespace MediaBrowser.ServerApplication
}
}
+ private static void DisposeAppHost()
+ {
+ if (!_appHostDisposed)
+ {
+ _logger.Info("Disposing app host");
+
+ _appHostDisposed = true;
+ _appHost.Dispose();
+ }
+ }
+
private static void ShutdownWindowsApplication()
{
_logger.Info("Calling Application.Exit");
Application.Exit();
+ Environment.Exit(0);
+
_logger.Info("Calling ApplicationTaskCompletionSource.SetResult");
ApplicationTaskCompletionSource.SetResult(true);
}
diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
index 3b4b52af3..ee7d782eb 100644
--- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
+++ b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
@@ -64,8 +64,9 @@
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\CommonIO.1.0.0.5\lib\net45\CommonIO.dll</HintPath>
</Reference>
- <Reference Include="ImageMagickSharp">
- <HintPath>..\packages\ImageMagickSharp.1.0.0.16\lib\net45\ImageMagickSharp.dll</HintPath>
+ <Reference Include="ImageMagickSharp, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\packages\ImageMagickSharp.1.0.0.17\lib\net45\ImageMagickSharp.dll</HintPath>
</Reference>
<Reference Include="MediaBrowser.IsoMounter">
<HintPath>..\packages\MediaBrowser.IsoMounting.3.0.69\lib\net45\MediaBrowser.IsoMounter.dll</HintPath>
diff --git a/MediaBrowser.ServerApplication/packages.config b/MediaBrowser.ServerApplication/packages.config
index dec8199cc..3ea97a30e 100644
--- a/MediaBrowser.ServerApplication/packages.config
+++ b/MediaBrowser.ServerApplication/packages.config
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="CommonIO" version="1.0.0.5" targetFramework="net45" />
- <package id="ImageMagickSharp" version="1.0.0.16" targetFramework="net45" />
+ <package id="ImageMagickSharp" version="1.0.0.17" targetFramework="net45" />
<package id="MediaBrowser.IsoMounting" version="3.0.69" targetFramework="net45" />
<package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" />
<package id="System.Data.SQLite.Core" version="1.0.94.0" targetFramework="net45" />
diff --git a/SharedVersion.cs b/SharedVersion.cs
index 4b8a8c61d..5aa872085 100644
--- a/SharedVersion.cs
+++ b/SharedVersion.cs
@@ -1,4 +1,4 @@
using System.Reflection;
-//[assembly: AssemblyVersion("3.0.*")]
-[assembly: AssemblyVersion("3.0.5768.7")]
+[assembly: AssemblyVersion("3.0.*")]
+//[assembly: AssemblyVersion("3.0.5768.7")]