aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--BDInfo/BDInfo.csproj4
-rw-r--r--BDInfo/project.json17
-rw-r--r--DvdLib/DvdLib.csproj4
-rw-r--r--DvdLib/project.json17
-rw-r--r--Emby.Common.Implementations/Emby.Common.Implementations.csproj7
-rw-r--r--Emby.Common.Implementations/TextEncoding/TextEncoding.cs1
-rw-r--r--Emby.Common.Implementations/packages.config4
-rw-r--r--Emby.Dlna/Profiles/DefaultProfile.cs2
-rw-r--r--Emby.Dlna/Profiles/MediaMonkeyProfile.cs37
-rw-r--r--Emby.Dlna/Profiles/Xml/Default.xml2
-rw-r--r--Emby.Dlna/Profiles/Xml/MediaMonkey.xml7
-rw-r--r--Emby.Dlna/project.json17
-rw-r--r--Emby.Drawing.ImageMagick/ImageMagickEncoder.cs2
-rw-r--r--Emby.Drawing.Skia/SkiaEncoder.cs136
-rw-r--r--Emby.Drawing/ImageProcessor.cs28
-rw-r--r--Emby.Drawing/NullImageEncoder.cs2
-rw-r--r--Emby.Drawing/project.json17
-rw-r--r--Emby.Photos/project.json17
-rw-r--r--Emby.Server.Core/Emby.Server.Core.csproj5
-rw-r--r--Emby.Server.Core/IO/LibraryMonitor.cs8
-rw-r--r--Emby.Server.Core/packages.config2
-rw-r--r--Emby.Server.Implementations/Activity/ActivityLogEntryPoint.cs4
-rw-r--r--Emby.Server.Implementations/Channels/ChannelManager.cs25
-rw-r--r--Emby.Server.Implementations/Data/SqliteItemRepository.cs72
-rw-r--r--Emby.Server.Implementations/Dto/DtoService.cs24
-rw-r--r--Emby.Server.Implementations/Emby.Server.Implementations.csproj3
-rw-r--r--Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs5
-rw-r--r--Emby.Server.Implementations/Library/LibraryManager.cs14
-rw-r--r--Emby.Server.Implementations/Library/UserManager.cs3
-rw-r--r--Emby.Server.Implementations/Library/UserViewManager.cs11
-rw-r--r--Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs5
-rw-r--r--Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs104
-rw-r--r--Emby.Server.Implementations/LiveTv/LiveStreamHelper.cs2
-rw-r--r--Emby.Server.Implementations/LiveTv/LiveTvManager.cs45
-rw-r--r--Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs2
-rw-r--r--Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs4
-rw-r--r--Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs12
-rw-r--r--Emby.Server.Implementations/Notifications/Notifications.cs5
-rw-r--r--Emby.Server.Implementations/Properties/AssemblyInfo.cs4
-rw-r--r--Emby.Server.Implementations/Session/SessionManager.cs200
-rw-r--r--MediaBrowser.Api/ItemUpdateService.cs10
-rw-r--r--MediaBrowser.Api/Library/LibraryService.cs12
-rw-r--r--MediaBrowser.Api/Playback/BaseStreamingService.cs1
-rw-r--r--MediaBrowser.Api/Playback/MediaInfoService.cs50
-rw-r--r--MediaBrowser.Api/Playback/StreamState.cs242
-rw-r--r--MediaBrowser.Api/Session/SessionsService.cs23
-rw-r--r--MediaBrowser.Api/StartupWizardService.cs1
-rw-r--r--MediaBrowser.Api/project.json17
-rw-r--r--MediaBrowser.Common/MediaBrowser.Common.csproj3
-rw-r--r--MediaBrowser.Common/Updates/GithubUpdater.cs4
-rw-r--r--MediaBrowser.Common/project.json17
-rw-r--r--MediaBrowser.Controller/Channels/Channel.cs1
-rw-r--r--MediaBrowser.Controller/Drawing/IImageEncoder.cs2
-rw-r--r--MediaBrowser.Controller/Entities/AggregateFolder.cs2
-rw-r--r--MediaBrowser.Controller/Entities/Audio/Audio.cs2
-rw-r--r--MediaBrowser.Controller/Entities/Audio/MusicArtist.cs4
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs121
-rw-r--r--MediaBrowser.Controller/Entities/CollectionFolder.cs4
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs26
-rw-r--r--MediaBrowser.Controller/Entities/IHasMetadata.cs2
-rw-r--r--MediaBrowser.Controller/Entities/InternalItemsQuery.cs6
-rw-r--r--MediaBrowser.Controller/Entities/InternalPeopleQuery.cs2
-rw-r--r--MediaBrowser.Controller/Entities/Movies/BoxSet.cs2
-rw-r--r--MediaBrowser.Controller/Entities/TV/Episode.cs574
-rw-r--r--MediaBrowser.Controller/Entities/TV/Season.cs2
-rw-r--r--MediaBrowser.Controller/Entities/UserRootFolder.cs2
-rw-r--r--MediaBrowser.Controller/Entities/Video.cs3
-rw-r--r--MediaBrowser.Controller/Library/ILibraryManager.cs2
-rw-r--r--MediaBrowser.Controller/Library/PlaybackProgressEventArgs.cs4
-rw-r--r--MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs1
-rw-r--r--MediaBrowser.Controller/LiveTv/LiveTvChannel.cs3
-rw-r--r--MediaBrowser.Controller/LiveTv/LiveTvProgram.cs1
-rw-r--r--MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs1
-rw-r--r--MediaBrowser.Controller/LiveTv/ProgramInfo.cs4
-rw-r--r--MediaBrowser.Controller/LiveTv/RecordingGroup.cs1
-rw-r--r--MediaBrowser.Controller/MediaBrowser.Controller.csproj4
-rw-r--r--MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs16
-rw-r--r--MediaBrowser.Controller/MediaEncoding/EncodingJobInfo.cs267
-rw-r--r--MediaBrowser.Controller/Playlists/Playlist.cs2
-rw-r--r--MediaBrowser.Controller/Session/ISessionManager.cs4
-rw-r--r--MediaBrowser.Controller/Session/SessionInfo.cs6
-rw-r--r--MediaBrowser.Controller/project.json17
-rw-r--r--MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs19
-rw-r--r--MediaBrowser.LocalMetadata/MediaBrowser.LocalMetadata.csproj9
-rw-r--r--MediaBrowser.LocalMetadata/Parsers/BaseItemXmlParser.cs14
-rw-r--r--MediaBrowser.LocalMetadata/Parsers/BoxSetXmlParser.cs28
-rw-r--r--MediaBrowser.LocalMetadata/Parsers/EpisodeXmlParser.cs271
-rw-r--r--MediaBrowser.LocalMetadata/Parsers/MovieXmlParser.cs65
-rw-r--r--MediaBrowser.LocalMetadata/Parsers/MusicVideoXmlParser.cs51
-rw-r--r--MediaBrowser.LocalMetadata/Parsers/SeriesXmlParser.cs102
-rw-r--r--MediaBrowser.LocalMetadata/Providers/EpisodeXmlProvider.cs50
-rw-r--r--MediaBrowser.LocalMetadata/Providers/MovieXmlProvider.cs62
-rw-r--r--MediaBrowser.LocalMetadata/Providers/MusicVideoXmlProvider.cs37
-rw-r--r--MediaBrowser.LocalMetadata/Providers/SeriesXmlProvider.cs50
-rw-r--r--MediaBrowser.LocalMetadata/Providers/VideoXmlProvider.cs37
-rw-r--r--MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs5
-rw-r--r--MediaBrowser.LocalMetadata/project.json17
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs3
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs242
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs1
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs7
-rw-r--r--MediaBrowser.MediaEncoding/project.json17
-rw-r--r--MediaBrowser.Model/Configuration/ServerConfiguration.cs2
-rw-r--r--MediaBrowser.Model/Dlna/CodecProfile.cs20
-rw-r--r--MediaBrowser.Model/Dlna/StreamBuilder.cs4
-rw-r--r--MediaBrowser.Model/Dto/BaseItemDto.cs8
-rw-r--r--MediaBrowser.Model/Entities/BaseItemInfo.cs178
-rw-r--r--MediaBrowser.Model/MediaBrowser.Model.csproj5
-rw-r--r--MediaBrowser.Model/MediaInfo/PlaybackInfoRequest.cs1
-rw-r--r--MediaBrowser.Model/Querying/ItemFields.cs5
-rw-r--r--MediaBrowser.Model/Session/PlaybackProgressInfo.cs6
-rw-r--r--MediaBrowser.Model/Session/PlaybackStopInfo.cs4
-rw-r--r--MediaBrowser.Model/Session/SessionInfoDto.cs6
-rw-r--r--MediaBrowser.Model/project.json17
-rw-r--r--MediaBrowser.Providers/Manager/ProviderManager.cs43
-rw-r--r--MediaBrowser.Providers/Manager/ProviderUtils.cs36
-rw-r--r--MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs7
-rw-r--r--MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs2
-rw-r--r--MediaBrowser.Providers/Omdb/OmdbImageProvider.cs20
-rw-r--r--MediaBrowser.Providers/Omdb/OmdbProvider.cs4
-rw-r--r--MediaBrowser.Providers/TV/TheMovieDb/MovieDbEpisodeProvider.cs2
-rw-r--r--MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeriesProvider.cs2
-rw-r--r--MediaBrowser.Providers/TV/TheTVDB/TvdbEpisodeProvider.cs2
-rw-r--r--MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesProvider.cs2
-rw-r--r--MediaBrowser.Providers/project.json17
-rw-r--r--MediaBrowser.Server.Implementations/project.json17
-rw-r--r--MediaBrowser.Server.Mono/ImageEncoderHelper.cs10
-rw-r--r--MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj14
-rw-r--r--MediaBrowser.Server.Mono/Properties/AssemblyInfo.cs2
-rw-r--r--MediaBrowser.Server.Mono/SkiaSharp.dll.config5
-rw-r--r--MediaBrowser.Server.Mono/packages.config4
-rw-r--r--MediaBrowser.ServerApplication/ImageEncoderHelper.cs9
-rw-r--r--MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj11
-rw-r--r--MediaBrowser.ServerApplication/packages.config4
-rw-r--r--MediaBrowser.WebDashboard/project.json17
-rw-r--r--MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs15
-rw-r--r--MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs6
-rw-r--r--MediaBrowser.XbmcMetadata/project.json17
-rw-r--r--Nuget/MediaBrowser.Common.nuspec2
-rw-r--r--Nuget/MediaBrowser.Server.Core.nuspec4
-rw-r--r--OpenSubtitlesHandler/OpenSubtitlesHandler.csproj3
-rw-r--r--OpenSubtitlesHandler/project.json17
-rw-r--r--RSSDP/project.json17
143 files changed, 1265 insertions, 2737 deletions
diff --git a/BDInfo/BDInfo.csproj b/BDInfo/BDInfo.csproj
index e7013f341..97abe7484 100644
--- a/BDInfo/BDInfo.csproj
+++ b/BDInfo/BDInfo.csproj
@@ -34,10 +34,6 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
- <None Include="project.json" />
- <!-- A reference to the entire .NET Framework is automatically included -->
- </ItemGroup>
- <ItemGroup>
<Compile Include="BDInfoSettings.cs" />
<Compile Include="BDROM.cs" />
<Compile Include="BitVector32.cs" />
diff --git a/BDInfo/project.json b/BDInfo/project.json
deleted file mode 100644
index fbbe9eaf3..000000000
--- a/BDInfo/project.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "frameworks":{
- "netstandard1.6":{
- "dependencies":{
- "NETStandard.Library":"1.6.0",
- }
- },
- ".NETPortable,Version=v4.5,Profile=Profile7":{
- "buildOptions": {
- "define": [ ]
- },
- "frameworkAssemblies":{
-
- }
- }
- }
-} \ No newline at end of file
diff --git a/DvdLib/DvdLib.csproj b/DvdLib/DvdLib.csproj
index ba63e77f0..9ed197c59 100644
--- a/DvdLib/DvdLib.csproj
+++ b/DvdLib/DvdLib.csproj
@@ -34,10 +34,6 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
- <None Include="project.json" />
- <!-- A reference to the entire .NET Framework is automatically included -->
- </ItemGroup>
- <ItemGroup>
<Compile Include="BigEndianBinaryReader.cs" />
<Compile Include="Ifo\AudioAttributes.cs" />
<Compile Include="Ifo\Cell.cs" />
diff --git a/DvdLib/project.json b/DvdLib/project.json
deleted file mode 100644
index fbbe9eaf3..000000000
--- a/DvdLib/project.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "frameworks":{
- "netstandard1.6":{
- "dependencies":{
- "NETStandard.Library":"1.6.0",
- }
- },
- ".NETPortable,Version=v4.5,Profile=Profile7":{
- "buildOptions": {
- "define": [ ]
- },
- "frameworkAssemblies":{
-
- }
- }
- }
-} \ No newline at end of file
diff --git a/Emby.Common.Implementations/Emby.Common.Implementations.csproj b/Emby.Common.Implementations/Emby.Common.Implementations.csproj
index bf52ff0c7..50d0d05ec 100644
--- a/Emby.Common.Implementations/Emby.Common.Implementations.csproj
+++ b/Emby.Common.Implementations/Emby.Common.Implementations.csproj
@@ -32,7 +32,7 @@
</PropertyGroup>
<ItemGroup>
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
- <HintPath>..\packages\NLog.4.4.9\lib\net45\NLog.dll</HintPath>
+ <HintPath>..\packages\NLog.4.4.10\lib\net45\NLog.dll</HintPath>
</Reference>
<Reference Include="ServiceStack.Text, Version=4.5.8.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\ServiceStack.Text.4.5.8\lib\net45\ServiceStack.Text.dll</HintPath>
@@ -42,9 +42,8 @@
<HintPath>..\packages\SharpCompress.0.14.0\lib\net45\SharpCompress.dll</HintPath>
<Private>True</Private>
</Reference>
- <Reference Include="SimpleInjector, Version=4.0.7.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
- <HintPath>..\packages\SimpleInjector.4.0.7\lib\net45\SimpleInjector.dll</HintPath>
- <Private>True</Private>
+ <Reference Include="SimpleInjector, Version=4.0.8.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
+ <HintPath>..\packages\SimpleInjector.4.0.8\lib\net45\SimpleInjector.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
diff --git a/Emby.Common.Implementations/TextEncoding/TextEncoding.cs b/Emby.Common.Implementations/TextEncoding/TextEncoding.cs
index f47b88fb5..49b424d5f 100644
--- a/Emby.Common.Implementations/TextEncoding/TextEncoding.cs
+++ b/Emby.Common.Implementations/TextEncoding/TextEncoding.cs
@@ -157,6 +157,7 @@ namespace Emby.Common.Implementations.TextEncoding
case "ota":
case "tur":
return "windows-1254";
+ case "bgr":
case "rus":
return "windows-1251";
case "vie":
diff --git a/Emby.Common.Implementations/packages.config b/Emby.Common.Implementations/packages.config
index ec0fc45bc..1e6b10c01 100644
--- a/Emby.Common.Implementations/packages.config
+++ b/Emby.Common.Implementations/packages.config
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
- <package id="NLog" version="4.4.9" targetFramework="net46" />
+ <package id="NLog" version="4.4.10" targetFramework="net46" />
<package id="ServiceStack.Text" version="4.5.8" targetFramework="net462" />
<package id="SharpCompress" version="0.14.0" targetFramework="net462" />
- <package id="SimpleInjector" version="4.0.7" targetFramework="net462" />
+ <package id="SimpleInjector" version="4.0.8" targetFramework="net46" />
</packages> \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/DefaultProfile.cs b/Emby.Dlna/Profiles/DefaultProfile.cs
index 70d08f9a9..06ce93640 100644
--- a/Emby.Dlna/Profiles/DefaultProfile.cs
+++ b/Emby.Dlna/Profiles/DefaultProfile.cs
@@ -70,7 +70,7 @@ namespace Emby.Dlna.Profiles
new DirectPlayProfile
{
- Container = "aac,mp3,mpa,wav,wma,mp2,ogg,oga,webma,ape,opus,flac",
+ Container = "aac,mp3,mpa,wav,wma,mp2,ogg,oga,webma,ape,opus,flac,m4a",
Type = DlnaProfileType.Audio
}
};
diff --git a/Emby.Dlna/Profiles/MediaMonkeyProfile.cs b/Emby.Dlna/Profiles/MediaMonkeyProfile.cs
index 66bde1045..dc1c0c237 100644
--- a/Emby.Dlna/Profiles/MediaMonkeyProfile.cs
+++ b/Emby.Dlna/Profiles/MediaMonkeyProfile.cs
@@ -31,42 +31,7 @@ namespace Emby.Dlna.Profiles
{
new DirectPlayProfile
{
- Container = "mp3",
- AudioCodec = "mp2,mp3",
- Type = DlnaProfileType.Audio
- },
-
- new DirectPlayProfile
- {
- Container = "mp4",
- AudioCodec = "mp4",
- Type = DlnaProfileType.Audio
- },
-
- new DirectPlayProfile
- {
- Container = "aac,wav",
- Type = DlnaProfileType.Audio
- },
-
- new DirectPlayProfile
- {
- Container = "flac",
- AudioCodec = "flac",
- Type = DlnaProfileType.Audio
- },
-
- new DirectPlayProfile
- {
- Container = "asf",
- AudioCodec = "wmav2,wmapro,wmavoice",
- Type = DlnaProfileType.Audio
- },
-
- new DirectPlayProfile
- {
- Container = "ogg",
- AudioCodec = "vorbis",
+ Container = "aac,mp3,mpa,wav,wma,mp2,ogg,oga,webma,ape,opus,flac,m4a",
Type = DlnaProfileType.Audio
}
};
diff --git a/Emby.Dlna/Profiles/Xml/Default.xml b/Emby.Dlna/Profiles/Xml/Default.xml
index fe783e005..b07a2f7c2 100644
--- a/Emby.Dlna/Profiles/Xml/Default.xml
+++ b/Emby.Dlna/Profiles/Xml/Default.xml
@@ -30,7 +30,7 @@
<XmlRootAttributes />
<DirectPlayProfiles>
<DirectPlayProfile container="m4v,mpegts,ts,3gp,mov,xvid,vob,mkv,wmv,asf,ogm,ogv,m2v,avi,mpg,mpeg,mp4,webm,wtv,m2ts,dvr-ms" type="Video" />
- <DirectPlayProfile container="aac,mp3,mpa,wav,wma,mp2,ogg,oga,webma,ape,opus,flac" type="Audio" />
+ <DirectPlayProfile container="aac,mp3,mpa,wav,wma,mp2,ogg,oga,webma,ape,opus,flac,m4a" type="Audio" />
</DirectPlayProfiles>
<TranscodingProfiles>
<TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" copyTimestamps="false" context="Streaming" enableSubtitlesInManifest="false" minSegments="0" segmentLength="0" breakOnNonKeyFrames="false" />
diff --git a/Emby.Dlna/Profiles/Xml/MediaMonkey.xml b/Emby.Dlna/Profiles/Xml/MediaMonkey.xml
index d51cae988..94606a93c 100644
--- a/Emby.Dlna/Profiles/Xml/MediaMonkey.xml
+++ b/Emby.Dlna/Profiles/Xml/MediaMonkey.xml
@@ -35,12 +35,7 @@
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
<XmlRootAttributes />
<DirectPlayProfiles>
- <DirectPlayProfile container="mp3" audioCodec="mp2,mp3" type="Audio" />
- <DirectPlayProfile container="mp4" audioCodec="mp4" type="Audio" />
- <DirectPlayProfile container="aac,wav" type="Audio" />
- <DirectPlayProfile container="flac" audioCodec="flac" type="Audio" />
- <DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" type="Audio" />
- <DirectPlayProfile container="ogg" audioCodec="vorbis" type="Audio" />
+ <DirectPlayProfile container="aac,mp3,mpa,wav,wma,mp2,ogg,oga,webma,ape,opus,flac,m4a" type="Audio" />
</DirectPlayProfiles>
<TranscodingProfiles>
<TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" copyTimestamps="false" context="Streaming" enableSubtitlesInManifest="false" minSegments="0" segmentLength="0" breakOnNonKeyFrames="false" />
diff --git a/Emby.Dlna/project.json b/Emby.Dlna/project.json
deleted file mode 100644
index fbbe9eaf3..000000000
--- a/Emby.Dlna/project.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "frameworks":{
- "netstandard1.6":{
- "dependencies":{
- "NETStandard.Library":"1.6.0",
- }
- },
- ".NETPortable,Version=v4.5,Profile=Profile7":{
- "buildOptions": {
- "define": [ ]
- },
- "frameworkAssemblies":{
-
- }
- }
- }
-} \ No newline at end of file
diff --git a/Emby.Drawing.ImageMagick/ImageMagickEncoder.cs b/Emby.Drawing.ImageMagick/ImageMagickEncoder.cs
index 4c911cc7a..958ca85fd 100644
--- a/Emby.Drawing.ImageMagick/ImageMagickEncoder.cs
+++ b/Emby.Drawing.ImageMagick/ImageMagickEncoder.cs
@@ -130,7 +130,7 @@ namespace Emby.Drawing.ImageMagick
string.Equals(ext, ".webp", StringComparison.OrdinalIgnoreCase);
}
- public string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
+ public string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, ImageOrientation? orientation, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
{
// Even if the caller specified 100, don't use it because it takes forever
quality = Math.Min(quality, 99);
diff --git a/Emby.Drawing.Skia/SkiaEncoder.cs b/Emby.Drawing.Skia/SkiaEncoder.cs
index 222ecf733..2c7dc58c2 100644
--- a/Emby.Drawing.Skia/SkiaEncoder.cs
+++ b/Emby.Drawing.Skia/SkiaEncoder.cs
@@ -126,11 +126,11 @@ namespace Emby.Drawing.Skia
for (int row = 0; row < bitmap.Height; ++row)
{
if (IsAllWhiteRow(bitmap, row))
- topmost = row;
+ topmost = row + 1;
else break;
}
- int bottommost = 0;
+ int bottommost = bitmap.Height;
for (int row = bitmap.Height - 1; row >= 0; --row)
{
if (IsAllWhiteRow(bitmap, row))
@@ -138,11 +138,11 @@ namespace Emby.Drawing.Skia
else break;
}
- int leftmost = 0, rightmost = 0;
+ int leftmost = 0, rightmost = bitmap.Width;
for (int col = 0; col < bitmap.Width; ++col)
{
if (IsAllWhiteColumn(bitmap, col))
- leftmost = col;
+ leftmost = col + 1;
else
break;
}
@@ -162,13 +162,6 @@ namespace Emby.Drawing.Skia
using (var subset = image.Subset(newRect))
{
return SKBitmap.FromImage(subset);
- //using (var data = subset.Encode(StripCollageBuilder.GetEncodedFormat(outputPath), 90))
- //{
- // using (var fileStream = _fileSystem.GetFileStream(outputPath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read))
- // {
- // data.AsStream().CopyTo(fileStream);
- // }
- //}
}
}
}
@@ -191,7 +184,7 @@ namespace Emby.Drawing.Skia
}
private string[] TransparentImageTypes = new string[] { ".png", ".gif", ".webp" };
- private SKBitmap Decode(string path, bool forceCleanBitmap = false)
+ private SKBitmap Decode(string path, bool forceCleanBitmap, out SKCodecOrigin origin)
{
var requiresTransparencyHack = TransparentImageTypes.Contains(Path.GetExtension(path) ?? string.Empty);
@@ -206,6 +199,8 @@ namespace Emby.Drawing.Skia
// decode
codec.GetPixels(bitmap.Info, bitmap.GetPixels());
+ origin = codec.Origin;
+
return bitmap;
}
}
@@ -214,7 +209,7 @@ namespace Emby.Drawing.Skia
if (resultBitmap == null)
{
- return Decode(path, true);
+ return Decode(path, true, out origin);
}
// If we have to resize these they often end up distorted
@@ -222,27 +217,128 @@ namespace Emby.Drawing.Skia
{
using (resultBitmap)
{
- return Decode(path, true);
+ return Decode(path, true, out origin);
}
}
+ origin = SKCodecOrigin.TopLeft;
return resultBitmap;
}
- private SKBitmap GetBitmap(string path, bool cropWhitespace)
+ private SKBitmap GetBitmap(string path, bool cropWhitespace, bool forceAnalyzeBitmap, out SKCodecOrigin origin)
{
if (cropWhitespace)
{
- using (var bitmap = Decode(path))
+ using (var bitmap = Decode(path, forceAnalyzeBitmap, out origin))
{
return CropWhiteSpace(bitmap);
}
}
- return Decode(path);
+ return Decode(path, forceAnalyzeBitmap, out origin);
+ }
+
+ private SKBitmap GetBitmap(string path, bool cropWhitespace, bool autoOrient, ImageOrientation? orientation)
+ {
+ SKCodecOrigin origin;
+
+ if (autoOrient)
+ {
+ var bitmap = GetBitmap(path, cropWhitespace, true, out origin);
+
+ if (origin != SKCodecOrigin.TopLeft)
+ {
+ using (bitmap)
+ {
+ return RotateAndFlip(bitmap, origin);
+ }
+ }
+
+ return bitmap;
+ }
+
+ return GetBitmap(path, cropWhitespace, false, out origin);
+ }
+
+ private SKBitmap RotateAndFlip(SKBitmap original, SKCodecOrigin origin)
+ {
+ // these are the origins that represent a 90 degree turn in some fashion
+ var differentOrientations = new SKCodecOrigin[]
+ {
+ SKCodecOrigin.LeftBottom,
+ SKCodecOrigin.LeftTop,
+ SKCodecOrigin.RightBottom,
+ SKCodecOrigin.RightTop
+ };
+
+ // check if we need to turn the image
+ bool isDifferentOrientation = differentOrientations.Any(o => o == origin);
+
+ // define new width/height
+ var width = isDifferentOrientation ? original.Height : original.Width;
+ var height = isDifferentOrientation ? original.Width : original.Height;
+
+ var bitmap = new SKBitmap(width, height, true);
+
+ // todo: the stuff in this switch statement should be rewritten to use pointers
+ switch (origin)
+ {
+ case SKCodecOrigin.LeftBottom:
+
+ for (var x = 0; x < original.Width; x++)
+ for (var y = 0; y < original.Height; y++)
+ bitmap.SetPixel(y, original.Width - 1 - x, original.GetPixel(x, y));
+ break;
+
+ case SKCodecOrigin.RightTop:
+
+ for (var x = 0; x < original.Width; x++)
+ for (var y = 0; y < original.Height; y++)
+ bitmap.SetPixel(original.Height - 1 - y, x, original.GetPixel(x, y));
+ break;
+
+ case SKCodecOrigin.RightBottom:
+
+ for (var x = 0; x < original.Width; x++)
+ for (var y = 0; y < original.Height; y++)
+ bitmap.SetPixel(original.Height - 1 - y, original.Width - 1 - x, original.GetPixel(x, y));
+
+ break;
+
+ case SKCodecOrigin.LeftTop:
+
+ for (var x = 0; x < original.Width; x++)
+ for (var y = 0; y < original.Height; y++)
+ bitmap.SetPixel(y, x, original.GetPixel(x, y));
+ break;
+
+ case SKCodecOrigin.BottomLeft:
+
+ for (var x = 0; x < original.Width; x++)
+ for (var y = 0; y < original.Height; y++)
+ bitmap.SetPixel(x, original.Height - 1 - y, original.GetPixel(x, y));
+ break;
+
+ case SKCodecOrigin.BottomRight:
+
+ for (var x = 0; x < original.Width; x++)
+ for (var y = 0; y < original.Height; y++)
+ bitmap.SetPixel(original.Width - 1 - x, original.Height - 1 - y, original.GetPixel(x, y));
+ break;
+
+ case SKCodecOrigin.TopRight:
+
+ for (var x = 0; x < original.Width; x++)
+ for (var y = 0; y < original.Height; y++)
+ bitmap.SetPixel(original.Width - 1 - x, y, original.GetPixel(x, y));
+ break;
+
+ }
+
+ return bitmap;
}
- public string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
+ public string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, ImageOrientation? orientation, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
{
if (string.IsNullOrWhiteSpace(inputPath))
{
@@ -260,7 +356,7 @@ namespace Emby.Drawing.Skia
var blur = options.Blur ?? 0;
var hasIndicator = options.AddPlayedIndicator || options.UnplayedCount.HasValue || !options.PercentPlayed.Equals(0);
- using (var bitmap = GetBitmap(inputPath, options.CropWhiteSpace))
+ using (var bitmap = GetBitmap(inputPath, options.CropWhiteSpace, autoOrient, orientation))
{
if (bitmap == null)
{
@@ -272,7 +368,7 @@ namespace Emby.Drawing.Skia
var originalImageSize = new ImageSize(bitmap.Width, bitmap.Height);
ImageHelper.SaveImageSize(inputPath, dateModified, originalImageSize);
- if (!options.CropWhiteSpace && options.HasDefaultOptions(inputPath, originalImageSize))
+ if (!options.CropWhiteSpace && options.HasDefaultOptions(inputPath, originalImageSize) && !autoOrient)
{
// Just spit out the original file if all the options are default
return inputPath;
diff --git a/Emby.Drawing/ImageProcessor.cs b/Emby.Drawing/ImageProcessor.cs
index a1543382f..eb5e0d82a 100644
--- a/Emby.Drawing/ImageProcessor.cs
+++ b/Emby.Drawing/ImageProcessor.cs
@@ -217,14 +217,23 @@ namespace Emby.Drawing
dateModified = tuple.Item2;
}
- if (options.HasDefaultOptions(originalImagePath))
+ var photo = item as Photo;
+ var autoOrient = false;
+ ImageOrientation? orientation = null;
+ if (photo != null && photo.Orientation.HasValue && photo.Orientation.Value != ImageOrientation.TopLeft)
+ {
+ autoOrient = true;
+ orientation = photo.Orientation;
+ }
+
+ if (options.HasDefaultOptions(originalImagePath) && !autoOrient)
{
// Just spit out the original file if all the options are default
return new Tuple<string, string, DateTime>(originalImagePath, MimeTypes.GetMimeType(originalImagePath), dateModified);
}
ImageSize? originalImageSize = GetSavedImageSize(originalImagePath, dateModified);
- if (originalImageSize.HasValue && options.HasDefaultOptions(originalImagePath, originalImageSize.Value))
+ if (originalImageSize.HasValue && options.HasDefaultOptions(originalImagePath, originalImageSize.Value) && !autoOrient)
{
// Just spit out the original file if all the options are default
_logger.Info("Returning original image {0}", originalImagePath);
@@ -243,7 +252,6 @@ namespace Emby.Drawing
if (!_fileSystem.FileExists(cacheFilePath))
{
- _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(cacheFilePath));
var tmpPath = Path.ChangeExtension(Path.Combine(_appPaths.TempDirectory, Guid.NewGuid().ToString("N")), Path.GetExtension(cacheFilePath));
_fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(tmpPath));
@@ -252,13 +260,14 @@ namespace Emby.Drawing
item = _libraryManager().GetItemById(options.ItemId);
}
- var resultPath =_imageEncoder.EncodeImage(originalImagePath, dateModified, tmpPath, AutoOrient(item), quality, options, outputFormat);
+ var resultPath = _imageEncoder.EncodeImage(originalImagePath, dateModified, tmpPath, autoOrient, orientation, quality, options, outputFormat);
if (string.Equals(resultPath, originalImagePath, StringComparison.OrdinalIgnoreCase))
{
return new Tuple<string, string, DateTime>(originalImagePath, MimeTypes.GetMimeType(originalImagePath), dateModified);
}
+ _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(cacheFilePath));
CopyFile(tmpPath, cacheFilePath);
return new Tuple<string, string, DateTime>(tmpPath, GetMimeType(outputFormat, cacheFilePath), _fileSystem.GetLastWriteTimeUtc(tmpPath));
@@ -288,17 +297,6 @@ namespace Emby.Drawing
}
}
- private bool AutoOrient(IHasImages item)
- {
- var photo = item as Photo;
- if (photo != null && photo.Orientation.HasValue)
- {
- return true;
- }
-
- return false;
- }
-
//private static int[][] OPERATIONS = new int[][] {
// TopLeft
//new int[] { 0, NONE},
diff --git a/Emby.Drawing/NullImageEncoder.cs b/Emby.Drawing/NullImageEncoder.cs
index 2241c5a86..f04e8aaf1 100644
--- a/Emby.Drawing/NullImageEncoder.cs
+++ b/Emby.Drawing/NullImageEncoder.cs
@@ -32,7 +32,7 @@ namespace Emby.Drawing
throw new NotImplementedException();
}
- public string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
+ public string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, ImageOrientation? orientation, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
{
throw new NotImplementedException();
}
diff --git a/Emby.Drawing/project.json b/Emby.Drawing/project.json
deleted file mode 100644
index fbbe9eaf3..000000000
--- a/Emby.Drawing/project.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "frameworks":{
- "netstandard1.6":{
- "dependencies":{
- "NETStandard.Library":"1.6.0",
- }
- },
- ".NETPortable,Version=v4.5,Profile=Profile7":{
- "buildOptions": {
- "define": [ ]
- },
- "frameworkAssemblies":{
-
- }
- }
- }
-} \ No newline at end of file
diff --git a/Emby.Photos/project.json b/Emby.Photos/project.json
deleted file mode 100644
index fbbe9eaf3..000000000
--- a/Emby.Photos/project.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "frameworks":{
- "netstandard1.6":{
- "dependencies":{
- "NETStandard.Library":"1.6.0",
- }
- },
- ".NETPortable,Version=v4.5,Profile=Profile7":{
- "buildOptions": {
- "define": [ ]
- },
- "frameworkAssemblies":{
-
- }
- }
- }
-} \ No newline at end of file
diff --git a/Emby.Server.Core/Emby.Server.Core.csproj b/Emby.Server.Core/Emby.Server.Core.csproj
index 01193bb6c..063ef6eb9 100644
--- a/Emby.Server.Core/Emby.Server.Core.csproj
+++ b/Emby.Server.Core/Emby.Server.Core.csproj
@@ -41,9 +41,8 @@
<HintPath>..\packages\ServiceStack.Text.4.5.8\lib\net45\ServiceStack.Text.dll</HintPath>
<Private>True</Private>
</Reference>
- <Reference Include="SimpleInjector, Version=4.0.7.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
- <HintPath>..\packages\SimpleInjector.4.0.7\lib\net45\SimpleInjector.dll</HintPath>
- <Private>True</Private>
+ <Reference Include="SimpleInjector, Version=4.0.8.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
+ <HintPath>..\packages\SimpleInjector.4.0.8\lib\net45\SimpleInjector.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
diff --git a/Emby.Server.Core/IO/LibraryMonitor.cs b/Emby.Server.Core/IO/LibraryMonitor.cs
index 0f0640a38..ebc5e5e55 100644
--- a/Emby.Server.Core/IO/LibraryMonitor.cs
+++ b/Emby.Server.Core/IO/LibraryMonitor.cs
@@ -332,7 +332,13 @@ namespace Emby.Server.Core.IO
NotifyFilters.Attributes;
newWatcher.Created += watcher_Changed;
- newWatcher.Deleted += watcher_Changed;
+
+ // Seeing mono crashes on background threads we can't catch, testing if this might help
+ if (_environmentInfo.OperatingSystem == MediaBrowser.Model.System.OperatingSystem.Windows)
+ {
+ newWatcher.Deleted += watcher_Changed;
+ }
+
newWatcher.Renamed += watcher_Changed;
newWatcher.Changed += watcher_Changed;
diff --git a/Emby.Server.Core/packages.config b/Emby.Server.Core/packages.config
index 24e8a26b6..6311b55eb 100644
--- a/Emby.Server.Core/packages.config
+++ b/Emby.Server.Core/packages.config
@@ -2,5 +2,5 @@
<packages>
<package id="Microsoft.IO.RecyclableMemoryStream" version="1.2.2" targetFramework="net462" />
<package id="ServiceStack.Text" version="4.5.8" targetFramework="net462" />
- <package id="SimpleInjector" version="4.0.7" targetFramework="net462" />
+ <package id="SimpleInjector" version="4.0.8" targetFramework="net46" />
</packages> \ No newline at end of file
diff --git a/Emby.Server.Implementations/Activity/ActivityLogEntryPoint.cs b/Emby.Server.Implementations/Activity/ActivityLogEntryPoint.cs
index d3b2ef7ef..567f139fd 100644
--- a/Emby.Server.Implementations/Activity/ActivityLogEntryPoint.cs
+++ b/Emby.Server.Implementations/Activity/ActivityLogEntryPoint.cs
@@ -123,7 +123,7 @@ namespace Emby.Server.Implementations.Activity
return;
}
- if (item.IsThemeMedia)
+ if (e.Item != null && e.Item.IsThemeMedia)
{
// Don't report theme song or local trailer playback
return;
@@ -155,7 +155,7 @@ namespace Emby.Server.Implementations.Activity
return;
}
- if (item.IsThemeMedia)
+ if (e.Item != null && e.Item.IsThemeMedia)
{
// Don't report theme song or local trailer playback
return;
diff --git a/Emby.Server.Implementations/Channels/ChannelManager.cs b/Emby.Server.Implementations/Channels/ChannelManager.cs
index 809771b04..73878160c 100644
--- a/Emby.Server.Implementations/Channels/ChannelManager.cs
+++ b/Emby.Server.Implementations/Channels/ChannelManager.cs
@@ -176,7 +176,9 @@ namespace Emby.Server.Implementations.Channels
var internalResult = await GetChannelsInternal(query, cancellationToken).ConfigureAwait(false);
- var dtoOptions = new DtoOptions();
+ var dtoOptions = new DtoOptions()
+ {
+ };
var returnItems = (await _dtoService.GetBaseItemDtos(internalResult.Items, dtoOptions, user).ConfigureAwait(false))
.ToArray();
@@ -558,7 +560,10 @@ namespace Emby.Server.Implementations.Channels
totalRecordCount = items.Length;
}
- var dtoOptions = new DtoOptions();
+ var dtoOptions = new DtoOptions()
+ {
+ Fields = query.Fields.ToList()
+ };
var returnItems = (await _dtoService.GetBaseItemDtos(items, dtoOptions, user).ConfigureAwait(false))
.ToArray();
@@ -825,7 +830,10 @@ namespace Emby.Server.Implementations.Channels
RefreshIfNeeded(internalResult.Items);
- var dtoOptions = new DtoOptions();
+ var dtoOptions = new DtoOptions()
+ {
+ Fields = query.Fields.ToList()
+ };
var returnItems = (await _dtoService.GetBaseItemDtos(internalResult.Items, dtoOptions, user).ConfigureAwait(false))
.ToArray();
@@ -974,7 +982,10 @@ namespace Emby.Server.Implementations.Channels
var internalResult = await GetChannelItemsInternal(query, new Progress<double>(), cancellationToken).ConfigureAwait(false);
- var dtoOptions = new DtoOptions();
+ var dtoOptions = new DtoOptions()
+ {
+ Fields = query.Fields.ToList()
+ };
var returnItems = (await _dtoService.GetBaseItemDtos(internalResult.Items, dtoOptions, user).ConfigureAwait(false))
.ToArray();
@@ -1378,12 +1389,6 @@ namespace Emby.Server.Implementations.Channels
item.SetImagePath(ImageType.Primary, info.ImageUrl);
}
- if (item.SourceType != SourceType.Channel)
- {
- item.SourceType = SourceType.Channel;
- forceUpdate = true;
- }
-
if (isNew)
{
await _libraryManager.CreateItem(item, cancellationToken).ConfigureAwait(false);
diff --git a/Emby.Server.Implementations/Data/SqliteItemRepository.cs b/Emby.Server.Implementations/Data/SqliteItemRepository.cs
index 49ba6c9f3..df3cecbf9 100644
--- a/Emby.Server.Implementations/Data/SqliteItemRepository.cs
+++ b/Emby.Server.Implementations/Data/SqliteItemRepository.cs
@@ -199,10 +199,11 @@ namespace Emby.Server.Implementations.Data
AddColumn(db, "TypedBaseItems", "ParentId", "GUID", existingColumnNames);
AddColumn(db, "TypedBaseItems", "Genres", "Text", existingColumnNames);
AddColumn(db, "TypedBaseItems", "SortName", "Text", existingColumnNames);
+ AddColumn(db, "TypedBaseItems", "ForcedSortName", "Text", existingColumnNames);
+
AddColumn(db, "TypedBaseItems", "RunTimeTicks", "BIGINT", existingColumnNames);
AddColumn(db, "TypedBaseItems", "HomePageUrl", "Text", existingColumnNames);
- AddColumn(db, "TypedBaseItems", "VoteCount", "INT", existingColumnNames);
AddColumn(db, "TypedBaseItems", "DisplayMediaType", "Text", existingColumnNames);
AddColumn(db, "TypedBaseItems", "DateCreated", "DATETIME", existingColumnNames);
AddColumn(db, "TypedBaseItems", "DateModified", "DATETIME", existingColumnNames);
@@ -233,7 +234,6 @@ namespace Emby.Server.Implementations.Data
AddColumn(db, "TypedBaseItems", "UnratedType", "Text", existingColumnNames);
AddColumn(db, "TypedBaseItems", "TopParentId", "Text", existingColumnNames);
AddColumn(db, "TypedBaseItems", "IsItemByName", "BIT", existingColumnNames);
- AddColumn(db, "TypedBaseItems", "SourceType", "Text", existingColumnNames);
AddColumn(db, "TypedBaseItems", "TrailerTypes", "Text", existingColumnNames);
AddColumn(db, "TypedBaseItems", "CriticRating", "Float", existingColumnNames);
AddColumn(db, "TypedBaseItems", "InheritedTags", "Text", existingColumnNames);
@@ -424,9 +424,8 @@ namespace Emby.Server.Implementations.Data
"OfficialRating",
"HomePageUrl",
"DisplayMediaType",
- "SortName",
+ "ForcedSortName",
"RunTimeTicks",
- "VoteCount",
"DateCreated",
"DateModified",
"guid",
@@ -439,7 +438,6 @@ namespace Emby.Server.Implementations.Data
"LockedFields",
"Studios",
"Tags",
- "SourceType",
"TrailerTypes",
"OriginalTitle",
"PrimaryVersionId",
@@ -541,9 +539,9 @@ namespace Emby.Server.Implementations.Data
"Genres",
"InheritedParentalRatingValue",
"SortName",
+ "ForcedSortName",
"RunTimeTicks",
"HomePageUrl",
- "VoteCount",
"DisplayMediaType",
"DateCreated",
"DateModified",
@@ -563,7 +561,6 @@ namespace Emby.Server.Implementations.Data
"UnratedType",
"TopParentId",
"IsItemByName",
- "SourceType",
"TrailerTypes",
"CriticRating",
"InheritedTags",
@@ -815,10 +812,12 @@ namespace Emby.Server.Implementations.Data
saveItemStatement.TryBind("@InheritedParentalRatingValue", item.InheritedParentalRatingValue);
saveItemStatement.TryBind("@SortName", item.SortName);
+
+ saveItemStatement.TryBind("@ForcedSortName", item.ForcedSortName);
+
saveItemStatement.TryBind("@RunTimeTicks", item.RunTimeTicks);
saveItemStatement.TryBind("@HomePageUrl", item.HomePageUrl);
- saveItemStatement.TryBind("@VoteCount", item.VoteCount);
saveItemStatement.TryBind("@DisplayMediaType", item.DisplayMediaType);
saveItemStatement.TryBind("@DateCreated", item.DateCreated);
saveItemStatement.TryBind("@DateModified", item.DateModified);
@@ -909,7 +908,6 @@ namespace Emby.Server.Implementations.Data
isByName = dualAccess == null || dualAccess.IsAccessedByName;
}
saveItemStatement.TryBind("@IsItemByName", isByName);
- saveItemStatement.TryBind("@SourceType", item.SourceType.ToString());
var trailer = item as Trailer;
if (trailer != null && trailer.TrailerTypes.Count > 0)
@@ -1624,7 +1622,7 @@ namespace Emby.Server.Implementations.Data
{
if (!reader.IsDBNull(index))
{
- item.SortName = reader.GetString(index);
+ item.ForcedSortName = reader.GetString(index);
}
index++;
}
@@ -1635,15 +1633,6 @@ namespace Emby.Server.Implementations.Data
}
index++;
- if (HasField(query, ItemFields.VoteCount))
- {
- if (!reader.IsDBNull(index))
- {
- item.VoteCount = reader.GetInt32(index);
- }
- index++;
- }
-
if (HasField(query, ItemFields.DateCreated))
{
if (!reader.IsDBNull(index))
@@ -1733,12 +1722,6 @@ namespace Emby.Server.Implementations.Data
index++;
}
- if (!reader.IsDBNull(index))
- {
- item.SourceType = (SourceType)Enum.Parse(typeof(SourceType), reader.GetString(index), true);
- }
- index++;
-
if (hasTrailerTypes)
{
var trailer = item as Trailer;
@@ -2283,7 +2266,7 @@ namespace Emby.Server.Implementations.Data
}
if (field == ItemFields.SortName)
{
- return new[] { "SortName" };
+ return new[] { "ForcedSortName" };
}
if (field == ItemFields.Taglines)
{
@@ -2306,7 +2289,6 @@ namespace Emby.Server.Implementations.Data
case ItemFields.HomePageUrl:
case ItemFields.Keywords:
case ItemFields.DisplayMediaType:
- case ItemFields.VoteCount:
case ItemFields.CustomRating:
case ItemFields.ProductionLocations:
case ItemFields.Settings:
@@ -3872,34 +3854,6 @@ namespace Emby.Server.Implementations.Data
}
}
- if (query.SourceTypes.Length == 1)
- {
- whereClauses.Add("SourceType=@SourceType");
- if (statement != null)
- {
- statement.TryBind("@SourceType", query.SourceTypes[0].ToString());
- }
- }
- else if (query.SourceTypes.Length > 1)
- {
- var inClause = string.Join(",", query.SourceTypes.Select(i => "'" + i + "'").ToArray());
- whereClauses.Add(string.Format("SourceType in ({0})", inClause));
- }
-
- if (query.ExcludeSourceTypes.Length == 1)
- {
- whereClauses.Add("SourceType<>@ExcludeSourceTypes");
- if (statement != null)
- {
- statement.TryBind("@ExcludeSourceTypes", query.ExcludeSourceTypes[0].ToString());
- }
- }
- else if (query.ExcludeSourceTypes.Length > 1)
- {
- var inClause = string.Join(",", query.ExcludeSourceTypes.Select(i => "'" + i + "'").ToArray());
- whereClauses.Add(string.Format("SourceType not in ({0})", inClause));
- }
-
if (query.TrailerTypes.Length > 0)
{
var clauses = new List<string>();
@@ -5017,14 +4971,6 @@ namespace Emby.Server.Implementations.Data
statement.TryBind("@NameContains", "%" + query.NameContains + "%");
}
}
- if (query.SourceTypes.Length == 1)
- {
- whereClauses.Add("(select sourcetype from typedbaseitems where guid=ItemId) = @SourceTypes");
- if (statement != null)
- {
- statement.TryBind("@SourceTypes", query.SourceTypes[0].ToString());
- }
- }
return whereClauses;
}
diff --git a/Emby.Server.Implementations/Dto/DtoService.cs b/Emby.Server.Implementations/Dto/DtoService.cs
index 45fbd69dc..6bf58455f 100644
--- a/Emby.Server.Implementations/Dto/DtoService.cs
+++ b/Emby.Server.Implementations/Dto/DtoService.cs
@@ -1058,11 +1058,6 @@ namespace Emby.Server.Implementations.Dto
dto.CommunityRating = item.CommunityRating;
}
- if (fields.Contains(ItemFields.VoteCount))
- {
- dto.VoteCount = item.VoteCount;
- }
-
//if (item.IsFolder)
//{
// var folder = (Folder)item;
@@ -1084,7 +1079,10 @@ namespace Emby.Server.Implementations.Dto
if (audio != null)
{
dto.Album = audio.Album;
- dto.ExtraType = audio.ExtraType;
+ if (audio.ExtraType.HasValue)
+ {
+ dto.ExtraType = audio.ExtraType.Value.ToString();
+ }
var albumParent = audio.AlbumEntity;
@@ -1239,7 +1237,10 @@ namespace Emby.Server.Implementations.Dto
dto.Chapters = GetChapterInfoDtos(item);
}
- dto.ExtraType = video.ExtraType;
+ if (video.ExtraType.HasValue)
+ {
+ dto.ExtraType = video.ExtraType.Value.ToString();
+ }
}
if (fields.Contains(ItemFields.MediaStreams))
@@ -1395,7 +1396,7 @@ namespace Emby.Server.Implementations.Dto
}
}
- if (fields.Contains(ItemFields.SeriesPrimaryImage))
+ //if (fields.Contains(ItemFields.SeriesPrimaryImage))
{
series = series ?? season.Series;
if (series != null)
@@ -1586,7 +1587,7 @@ namespace Emby.Server.Implementations.Dto
{
var imageInfo = item.GetImageInfo(ImageType.Primary, 0);
- if (imageInfo == null || !imageInfo.IsLocalFile)
+ if (imageInfo == null)
{
return null;
}
@@ -1610,6 +1611,11 @@ namespace Emby.Server.Implementations.Dto
}
else
{
+ if (!imageInfo.IsLocalFile)
+ {
+ return null;
+ }
+
try
{
size = _imageProcessor.GetImageSize(imageInfo);
diff --git a/Emby.Server.Implementations/Emby.Server.Implementations.csproj b/Emby.Server.Implementations/Emby.Server.Implementations.csproj
index 14d976325..df70680f1 100644
--- a/Emby.Server.Implementations/Emby.Server.Implementations.csproj
+++ b/Emby.Server.Implementations/Emby.Server.Implementations.csproj
@@ -31,6 +31,9 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
+ <Compile Include="..\SharedVersion.cs">
+ <Link>Properties\SharedVersion.cs</Link>
+ </Compile>
<Compile Include="Activity\ActivityLogEntryPoint.cs" />
<Compile Include="Activity\ActivityManager.cs" />
<Compile Include="Activity\ActivityRepository.cs" />
diff --git a/Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs b/Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs
index 54f9ca392..961f9886c 100644
--- a/Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs
+++ b/Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs
@@ -38,7 +38,10 @@ namespace Emby.Server.Implementations.Library
// Synology
"@eaDir",
"eaDir",
- "#recycle"
+ "#recycle",
+
+ // Qnap
+ "@Recycle"
};
diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs
index 42eda00b7..a08c74474 100644
--- a/Emby.Server.Implementations/Library/LibraryManager.cs
+++ b/Emby.Server.Implementations/Library/LibraryManager.cs
@@ -1292,7 +1292,7 @@ namespace Emby.Server.Implementations.Library
return item;
}
- public IEnumerable<BaseItem> GetItemList(InternalItemsQuery query)
+ public IEnumerable<BaseItem> GetItemList(InternalItemsQuery query, bool allowExternalContent)
{
if (query.Recursive && query.ParentId.HasValue)
{
@@ -1305,12 +1305,17 @@ namespace Emby.Server.Implementations.Library
if (query.User != null)
{
- AddUserToQuery(query, query.User);
+ AddUserToQuery(query, query.User, allowExternalContent);
}
return ItemRepository.GetItemList(query);
}
+ public IEnumerable<BaseItem> GetItemList(InternalItemsQuery query)
+ {
+ return GetItemList(query, true);
+ }
+
public int GetCount(InternalItemsQuery query)
{
if (query.Recursive && query.ParentId.HasValue)
@@ -1548,7 +1553,7 @@ namespace Emby.Server.Implementations.Library
query.Parent = null;
}
- private void AddUserToQuery(InternalItemsQuery query, User user)
+ private void AddUserToQuery(InternalItemsQuery query, User user, bool allowExternalContent = true)
{
if (query.AncestorIds.Length == 0 &&
!query.ParentId.HasValue &&
@@ -1561,7 +1566,8 @@ namespace Emby.Server.Implementations.Library
var userViews = _userviewManager().GetUserViews(new UserViewQuery
{
UserId = user.Id.ToString("N"),
- IncludeHidden = true
+ IncludeHidden = true,
+ IncludeExternalContent = allowExternalContent
}, CancellationToken.None).Result.ToList();
diff --git a/Emby.Server.Implementations/Library/UserManager.cs b/Emby.Server.Implementations/Library/UserManager.cs
index 0b9027291..8e8f8c4dc 100644
--- a/Emby.Server.Implementations/Library/UserManager.cs
+++ b/Emby.Server.Implementations/Library/UserManager.cs
@@ -202,8 +202,7 @@ namespace Emby.Server.Implementations.Library
private bool IsValidUsernameCharacter(char i)
{
- return char.IsLetterOrDigit(i) || char.Equals(i, '-') || char.Equals(i, '_') || char.Equals(i, '\'') ||
- char.Equals(i, '.');
+ return !char.Equals(i, '<') && !char.Equals(i, '>');
}
public string MakeValidUsername(string username)
diff --git a/Emby.Server.Implementations/Library/UserViewManager.cs b/Emby.Server.Implementations/Library/UserViewManager.cs
index f403ca266..a6ed84f29 100644
--- a/Emby.Server.Implementations/Library/UserViewManager.cs
+++ b/Emby.Server.Implementations/Library/UserViewManager.cs
@@ -280,7 +280,7 @@ namespace Emby.Server.Implementations.Library
} : new string[] { };
- return _libraryManager.GetItemList(new InternalItemsQuery(user)
+ var query = new InternalItemsQuery(user)
{
IncludeItemTypes = includeItemTypes,
SortOrder = SortOrder.Descending,
@@ -289,11 +289,16 @@ namespace Emby.Server.Implementations.Library
ExcludeItemTypes = excludeItemTypes,
IsVirtualItem = false,
Limit = limit * 5,
- SourceTypes = parents.Count == 0 ? new[] { SourceType.Library } : new SourceType[] { },
IsPlayed = isPlayed,
DtoOptions = options
+ };
- }, parents);
+ if (parents.Count == 0)
+ {
+ return _libraryManager.GetItemList(query, false);
+ }
+
+ return _libraryManager.GetItemList(query, parents);
}
}
}
diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
index 6ce2b88f1..a4c5b338e 100644
--- a/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
+++ b/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
@@ -2270,11 +2270,6 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
writer.WriteElementString("studio", studio);
}
- if (item.VoteCount.HasValue)
- {
- writer.WriteElementString("votes", item.VoteCount.Value.ToString(CultureInfo.InvariantCulture));
- }
-
writer.WriteEndElement();
writer.WriteEndDocument();
}
diff --git a/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs b/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs
index da6759b34..bba625cd1 100644
--- a/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs
+++ b/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs
@@ -136,6 +136,9 @@ namespace Emby.Server.Implementations.LiveTv.Listings
var requestBody = "[\"" + string.Join("\", \"", programsID) + "\"]";
httpOptions.RequestContent = requestBody;
+ double wideAspect = 1.77777778;
+ var primaryImageCategory = "Logo";
+
using (var innerResponse = await Post(httpOptions, true, info).ConfigureAwait(false))
{
StreamReader innerReader = new StreamReader(innerResponse.Content);
@@ -167,13 +170,25 @@ namespace Emby.Server.Implementations.LiveTv.Listings
{
var programEntry = programDict[schedule.programID];
- var allImages = (images[imageIndex].data ?? new List<ScheduleDirect.ImageData>()).OrderByDescending(GetSizeOrder).ToList();
+ var allImages = (images[imageIndex].data ?? new List<ScheduleDirect.ImageData>()).ToList();
var imagesWithText = allImages.Where(i => string.Equals(i.text, "yes", StringComparison.OrdinalIgnoreCase)).ToList();
+ var imagesWithoutText = allImages.Where(i => string.Equals(i.text, "no", StringComparison.OrdinalIgnoreCase)).ToList();
+
+ double desiredAspect = IsMovie(programEntry) ? 0.666666667 : wideAspect;
+
+ programEntry.primaryImage = GetProgramImage(ApiUrl, imagesWithText, true, desiredAspect) ??
+ GetProgramImage(ApiUrl, allImages, true, desiredAspect);
+
+ programEntry.thumbImage = GetProgramImage(ApiUrl, imagesWithText, true, wideAspect);
+
+ // Don't supply the same image twice
+ if (string.Equals(programEntry.primaryImage, programEntry.thumbImage, StringComparison.Ordinal))
+ {
+ programEntry.thumbImage = null;
+ }
- programEntry.primaryImage = GetProgramImage(ApiUrl, imagesWithText, "Logo", true, 600) ??
- GetProgramImage(ApiUrl, allImages, "Logo", true, 600);
+ programEntry.backdropImage = GetProgramImage(ApiUrl, imagesWithoutText, true, wideAspect);
- //programEntry.thumbImage = GetProgramImage(ApiUrl, data, "Iconic", false);
//programEntry.bannerImage = GetProgramImage(ApiUrl, data, "Banner", false) ??
// GetProgramImage(ApiUrl, data, "Banner-L1", false) ??
// GetProgramImage(ApiUrl, data, "Banner-LO", false) ??
@@ -220,9 +235,14 @@ namespace Emby.Server.Implementations.LiveTv.Listings
return channelNumber;
}
+ private bool IsMovie(ScheduleDirect.ProgramDetails programInfo)
+ {
+ var showType = programInfo.showType ?? string.Empty;
+ return showType.IndexOf("movie", StringComparison.OrdinalIgnoreCase) != -1 || showType.IndexOf("film", StringComparison.OrdinalIgnoreCase) != -1;
+ }
+
private ProgramInfo GetProgram(string channelId, ScheduleDirect.Program programInfo, ScheduleDirect.ProgramDetails details)
{
- //_logger.Debug("Show type is: " + (details.showType ?? "No ShowType"));
DateTime startAt = GetDate(programInfo.airDateTime);
DateTime endAt = startAt.AddSeconds(programInfo.duration);
ProgramAudio audioType = ProgramAudio.Stereo;
@@ -276,9 +296,10 @@ namespace Emby.Server.Implementations.LiveTv.Listings
IsRepeat = repeat,
IsSeries = showType.IndexOf("series", StringComparison.OrdinalIgnoreCase) != -1,
ImageUrl = details.primaryImage,
+ ThumbImageUrl = details.thumbImage,
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,
+ IsMovie = IsMovie(details),
Etag = programInfo.md5
};
@@ -378,49 +399,18 @@ namespace Emby.Server.Implementations.LiveTv.Listings
return date;
}
- private string GetProgramImage(string apiUrl, List<ScheduleDirect.ImageData> images, string category, bool returnDefaultImage, int desiredWidth)
+ private string GetProgramImage(string apiUrl, List<ScheduleDirect.ImageData> images, bool returnDefaultImage, double desiredAspect)
{
string url = null;
- var matches = images
- .Where(i => string.Equals(i.category, category, StringComparison.OrdinalIgnoreCase))
- .ToList();
-
- if (matches.Count == 0)
- {
- if (!returnDefaultImage)
- {
- return null;
- }
- matches = images;
- }
+ var matches = images;
- var match = matches.FirstOrDefault(i =>
- {
- if (!string.IsNullOrWhiteSpace(i.width))
- {
- int value;
- if (int.TryParse(i.width, out value))
- {
- return value <= desiredWidth;
- }
- }
+ matches = matches
+ .OrderBy(i => Math.Abs(desiredAspect - GetApsectRatio(i)))
+ .ThenByDescending(GetSizeOrder)
+ .ToList();
- return false;
- });
-
- if (match == null)
- {
- // Get the second lowest quality image, when possible
- if (matches.Count > 1)
- {
- match = matches[matches.Count - 2];
- }
- else
- {
- match = matches.FirstOrDefault();
- }
- }
+ var match = matches.FirstOrDefault();
if (match == null)
{
@@ -444,6 +434,31 @@ namespace Emby.Server.Implementations.LiveTv.Listings
return url;
}
+ private double GetApsectRatio(ScheduleDirect.ImageData i)
+ {
+ int width = 0;
+ int height = 0;
+
+ if (!string.IsNullOrWhiteSpace(i.width))
+ {
+ int.TryParse(i.width, out width);
+ }
+
+ if (!string.IsNullOrWhiteSpace(i.height))
+ {
+ int.TryParse(i.height, out height);
+ }
+
+ if (height == 0 || width == 0)
+ {
+ return 0;
+ }
+
+ double result = width;
+ result /= height;
+ return result;
+ }
+
private async Task<List<ScheduleDirect.ShowImages>> GetImageForPrograms(
ListingsProviderInfo info,
List<string> programIds,
@@ -1188,6 +1203,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
public bool hasImageArtwork { get; set; }
public string primaryImage { get; set; }
public string thumbImage { get; set; }
+ public string backdropImage { get; set; }
public string bannerImage { get; set; }
public string imageID { get; set; }
public string md5 { get; set; }
diff --git a/Emby.Server.Implementations/LiveTv/LiveStreamHelper.cs b/Emby.Server.Implementations/LiveTv/LiveStreamHelper.cs
index d56ddc57d..12da1464b 100644
--- a/Emby.Server.Implementations/LiveTv/LiveStreamHelper.cs
+++ b/Emby.Server.Implementations/LiveTv/LiveStreamHelper.cs
@@ -16,7 +16,7 @@ namespace Emby.Server.Implementations.LiveTv
private readonly IMediaEncoder _mediaEncoder;
private readonly ILogger _logger;
- const int AnalyzeDurationMs = 2000;
+ const int AnalyzeDurationMs = 1000;
public LiveStreamHelper(IMediaEncoder mediaEncoder, ILogger logger)
{
diff --git a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs
index c2f057560..4ad411c19 100644
--- a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs
+++ b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs
@@ -679,8 +679,7 @@ namespace Emby.Server.Implementations.LiveTv
item.SetImage(new ItemImageInfo
{
Path = info.ImagePath,
- Type = ImageType.Primary,
- IsPlaceholder = true
+ Type = ImageType.Primary
}, 0);
}
else if (!string.IsNullOrWhiteSpace(info.ImageUrl))
@@ -688,8 +687,46 @@ namespace Emby.Server.Implementations.LiveTv
item.SetImage(new ItemImageInfo
{
Path = info.ImageUrl,
- Type = ImageType.Primary,
- IsPlaceholder = true
+ Type = ImageType.Primary
+ }, 0);
+ }
+ }
+
+ if (!item.HasImage(ImageType.Thumb))
+ {
+ if (!string.IsNullOrWhiteSpace(info.ThumbImageUrl))
+ {
+ item.SetImage(new ItemImageInfo
+ {
+ Path = info.ThumbImageUrl,
+ Type = ImageType.Thumb
+
+ }, 0);
+ }
+ }
+
+ if (!item.HasImage(ImageType.Logo))
+ {
+ if (!string.IsNullOrWhiteSpace(info.LogoImageUrl))
+ {
+ item.SetImage(new ItemImageInfo
+ {
+ Path = info.LogoImageUrl,
+ Type = ImageType.Logo
+
+ }, 0);
+ }
+ }
+
+ if (!item.HasImage(ImageType.Backdrop))
+ {
+ if (!string.IsNullOrWhiteSpace(info.BackdropImageUrl))
+ {
+ item.SetImage(new ItemImageInfo
+ {
+ Path = info.BackdropImageUrl,
+ Type = ImageType.Backdrop
+
}, 0);
}
}
diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs
index 2afc3744f..153f86aed 100644
--- a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs
+++ b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs
@@ -422,6 +422,8 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
SupportsTranscoding = true,
IsInfiniteStream = true,
IgnoreDts = true,
+ //SupportsProbing = false,
+ //AnalyzeDurationMs = 2000000
//IgnoreIndex = true,
//ReadAtNativeFramerate = true
};
diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs
index 90bbaaf3d..d2e9c8bf0 100644
--- a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs
+++ b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs
@@ -117,7 +117,9 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
}
else
{
- await _multicastStream.CopyUntilCancelled(response.Content, () => Resolve(openTaskCompletionSource), cancellationToken).ConfigureAwait(false);
+ Resolve(openTaskCompletionSource);
+
+ await _multicastStream.CopyUntilCancelled(response.Content, null, cancellationToken).ConfigureAwait(false);
}
}
}
diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs
index 4c1190e0e..8d73c7e2b 100644
--- a/Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs
+++ b/Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs
@@ -235,10 +235,18 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
}
else
{
- numberString = Path.GetFileNameWithoutExtension(mediaUrl.Split('/').Last());
+ try
+ {
+ numberString = Path.GetFileNameWithoutExtension(mediaUrl.Split('/').Last());
- if (!IsValidChannelNumber(numberString))
+ if (!IsValidChannelNumber(numberString))
+ {
+ numberString = null;
+ }
+ }
+ catch
{
+ // Seeing occasional argument exception here
numberString = null;
}
}
diff --git a/Emby.Server.Implementations/Notifications/Notifications.cs b/Emby.Server.Implementations/Notifications/Notifications.cs
index 8f24dfe1a..f95b3f701 100644
--- a/Emby.Server.Implementations/Notifications/Notifications.cs
+++ b/Emby.Server.Implementations/Notifications/Notifications.cs
@@ -23,6 +23,7 @@ using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Model.Threading;
+using MediaBrowser.Model.Dto;
namespace Emby.Server.Implementations.Notifications
{
@@ -260,7 +261,7 @@ namespace Emby.Server.Implementations.Notifications
var item = e.MediaInfo;
- if ( item.IsThemeMedia)
+ if (e.Item != null && e.Item.IsThemeMedia)
{
// Don't report theme song or local trailer playback
return;
@@ -430,7 +431,7 @@ namespace Emby.Server.Implementations.Notifications
return name;
}
- public static string GetItemName(BaseItemInfo item)
+ public static string GetItemName(BaseItemDto item)
{
var name = item.Name;
diff --git a/Emby.Server.Implementations/Properties/AssemblyInfo.cs b/Emby.Server.Implementations/Properties/AssemblyInfo.cs
index ed7f9631f..28ffcbac6 100644
--- a/Emby.Server.Implementations/Properties/AssemblyInfo.cs
+++ b/Emby.Server.Implementations/Properties/AssemblyInfo.cs
@@ -25,6 +25,4 @@ using System.Runtime.InteropServices;
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
+// [assembly: AssemblyVersion("1.0.*")] \ No newline at end of file
diff --git a/Emby.Server.Implementations/Session/SessionManager.cs b/Emby.Server.Implementations/Session/SessionManager.cs
index 42cd5d1b1..a5582ddc5 100644
--- a/Emby.Server.Implementations/Session/SessionManager.cs
+++ b/Emby.Server.Implementations/Session/SessionManager.cs
@@ -338,7 +338,7 @@ namespace Emby.Server.Implementations.Session
}
}
- info.Item = GetItemInfo(libraryItem, libraryItem, mediaSource);
+ info.Item = GetItemInfo(libraryItem, mediaSource);
info.Item.RunTimeTicks = runtimeTicks;
}
@@ -813,7 +813,7 @@ namespace Emby.Server.Implementations.Session
mediaSource = await GetMediaSource(hasMediaSources, info.MediaSourceId, info.LiveStreamId).ConfigureAwait(false);
}
- info.Item = GetItemInfo(libraryItem, libraryItem, mediaSource);
+ info.Item = GetItemInfo(libraryItem, mediaSource);
}
else
{
@@ -1637,165 +1637,65 @@ namespace Emby.Server.Implementations.Session
return dto;
}
+ private DtoOptions _itemInfoDtoOptions;
+
/// <summary>
/// Converts a BaseItem to a BaseItemInfo
/// </summary>
- /// <param name="item">The item.</param>
- /// <param name="chapterOwner">The chapter owner.</param>
- /// <param name="mediaSource">The media source.</param>
- /// <returns>BaseItemInfo.</returns>
- /// <exception cref="System.ArgumentNullException">item</exception>
- private BaseItemInfo GetItemInfo(BaseItem item, BaseItem chapterOwner, MediaSourceInfo mediaSource)
+ private BaseItemDto GetItemInfo(BaseItem item, MediaSourceInfo mediaSource)
{
if (item == null)
{
throw new ArgumentNullException("item");
}
- var info = new BaseItemInfo
- {
- Id = GetDtoId(item),
- Name = item.Name,
- MediaType = item.MediaType,
- Type = item.GetClientTypeName(),
- RunTimeTicks = item.RunTimeTicks,
- IndexNumber = item.IndexNumber,
- ParentIndexNumber = item.ParentIndexNumber,
- PremiereDate = item.PremiereDate,
- ProductionYear = item.ProductionYear,
- IsThemeMedia = item.IsThemeMedia
- };
-
- info.PrimaryImageTag = GetImageCacheTag(item, ImageType.Primary);
- if (info.PrimaryImageTag != null)
- {
- info.PrimaryImageItemId = GetDtoId(item);
- }
-
- var episode = item as Episode;
- if (episode != null)
- {
- info.IndexNumberEnd = episode.IndexNumberEnd;
- }
-
- var hasSeries = item as IHasSeries;
- if (hasSeries != null)
- {
- info.SeriesName = hasSeries.SeriesName;
- }
-
- var recording = item as ILiveTvRecording;
- if (recording != null)
- {
- if (recording.IsSeries)
- {
- info.Name = recording.EpisodeTitle;
- info.SeriesName = recording.Name;
-
- if (string.IsNullOrWhiteSpace(info.Name))
- {
- info.Name = recording.Name;
- }
- }
- }
-
- var audio = item as Audio;
- if (audio != null)
- {
- info.Album = audio.Album;
- info.Artists = audio.Artists;
-
- if (info.PrimaryImageTag == null)
- {
- var album = audio.AlbumEntity;
-
- if (album != null && album.HasImage(ImageType.Primary))
- {
- info.PrimaryImageTag = GetImageCacheTag(album, ImageType.Primary);
- if (info.PrimaryImageTag != null)
- {
- info.PrimaryImageItemId = GetDtoId(album);
- }
- }
- }
- }
-
- var musicVideo = item as MusicVideo;
- if (musicVideo != null)
- {
- info.Album = musicVideo.Album;
- info.Artists = musicVideo.Artists.ToList();
- }
-
- var backropItem = item.HasImage(ImageType.Backdrop) ? item : null;
- var thumbItem = item.HasImage(ImageType.Thumb) ? item : null;
- var logoItem = item.HasImage(ImageType.Logo) ? item : null;
-
- if (thumbItem == null)
- {
- if (episode != null)
- {
- var series = episode.Series;
-
- if (series != null && series.HasImage(ImageType.Thumb))
- {
- thumbItem = series;
- }
- }
- }
+ var dtoOptions = _itemInfoDtoOptions;
- if (backropItem == null)
+ if (_itemInfoDtoOptions == null)
{
- if (episode != null)
+ dtoOptions = new DtoOptions
{
- var series = episode.Series;
-
- if (series != null && series.HasImage(ImageType.Backdrop))
- {
- backropItem = series;
- }
- }
- }
-
- if (backropItem == null)
- {
- backropItem = item.GetParents().FirstOrDefault(i => i.HasImage(ImageType.Backdrop));
- }
-
- if (thumbItem == null)
- {
- thumbItem = item.GetParents().FirstOrDefault(i => i.HasImage(ImageType.Thumb));
- }
-
- if (logoItem == null)
- {
- logoItem = item.GetParents().FirstOrDefault(i => i.HasImage(ImageType.Logo));
- }
-
- if (thumbItem != null)
- {
- info.ThumbImageTag = GetImageCacheTag(thumbItem, ImageType.Thumb);
- info.ThumbItemId = GetDtoId(thumbItem);
- }
-
- if (backropItem != null)
- {
- info.BackdropImageTag = GetImageCacheTag(backropItem, ImageType.Backdrop);
- info.BackdropItemId = GetDtoId(backropItem);
- }
-
- if (logoItem != null)
- {
- info.LogoImageTag = GetImageCacheTag(logoItem, ImageType.Logo);
- info.LogoItemId = GetDtoId(logoItem);
- }
-
- if (chapterOwner != null)
- {
- info.ChapterImagesItemId = chapterOwner.Id.ToString("N");
-
- info.Chapters = _dtoService.GetChapterInfoDtos(chapterOwner).ToList();
- }
+ AddProgramRecordingInfo = false
+ };
+
+ dtoOptions.Fields.Remove(ItemFields.BasicSyncInfo);
+ dtoOptions.Fields.Remove(ItemFields.SyncInfo);
+ dtoOptions.Fields.Remove(ItemFields.CanDelete);
+ dtoOptions.Fields.Remove(ItemFields.CanDownload);
+ dtoOptions.Fields.Remove(ItemFields.ChildCount);
+ dtoOptions.Fields.Remove(ItemFields.CustomRating);
+ dtoOptions.Fields.Remove(ItemFields.DateLastMediaAdded);
+ dtoOptions.Fields.Remove(ItemFields.DateLastRefreshed);
+ dtoOptions.Fields.Remove(ItemFields.DateLastSaved);
+ dtoOptions.Fields.Remove(ItemFields.DisplayMediaType);
+ dtoOptions.Fields.Remove(ItemFields.DisplayPreferencesId);
+ dtoOptions.Fields.Remove(ItemFields.Etag);
+ dtoOptions.Fields.Remove(ItemFields.ExternalEtag);
+ dtoOptions.Fields.Remove(ItemFields.IndexOptions);
+ dtoOptions.Fields.Remove(ItemFields.InheritedParentalRatingValue);
+ dtoOptions.Fields.Remove(ItemFields.ItemCounts);
+ dtoOptions.Fields.Remove(ItemFields.Keywords);
+ dtoOptions.Fields.Remove(ItemFields.MediaSourceCount);
+ dtoOptions.Fields.Remove(ItemFields.MediaStreams);
+ dtoOptions.Fields.Remove(ItemFields.MediaSources);
+ dtoOptions.Fields.Remove(ItemFields.People);
+ dtoOptions.Fields.Remove(ItemFields.PlayAccess);
+ dtoOptions.Fields.Remove(ItemFields.People);
+ dtoOptions.Fields.Remove(ItemFields.ProductionLocations);
+ dtoOptions.Fields.Remove(ItemFields.RecursiveItemCount);
+ dtoOptions.Fields.Remove(ItemFields.RemoteTrailers);
+ dtoOptions.Fields.Remove(ItemFields.SeasonUserData);
+ dtoOptions.Fields.Remove(ItemFields.SeriesGenres);
+ dtoOptions.Fields.Remove(ItemFields.Settings);
+ dtoOptions.Fields.Remove(ItemFields.SortName);
+ dtoOptions.Fields.Remove(ItemFields.Tags);
+ dtoOptions.Fields.Remove(ItemFields.ThemeSongIds);
+ dtoOptions.Fields.Remove(ItemFields.ThemeVideoIds);
+
+ _itemInfoDtoOptions = dtoOptions;
+ }
+
+ var info = _dtoService.GetBaseItemDto(item, dtoOptions);
if (mediaSource != null)
{
@@ -1837,7 +1737,7 @@ namespace Emby.Server.Implementations.Session
//ReportNowViewingItem(sessionId, info);
}
- public void ReportNowViewingItem(string sessionId, BaseItemInfo item)
+ public void ReportNowViewingItem(string sessionId, BaseItemDto item)
{
//var session = GetSession(sessionId);
diff --git a/MediaBrowser.Api/ItemUpdateService.cs b/MediaBrowser.Api/ItemUpdateService.cs
index cdc33dfd4..8c04e979e 100644
--- a/MediaBrowser.Api/ItemUpdateService.cs
+++ b/MediaBrowser.Api/ItemUpdateService.cs
@@ -206,15 +206,16 @@ namespace MediaBrowser.Api
var newLockData = request.LockData ?? false;
var isLockedChanged = item.IsLocked != newLockData;
- UpdateItem(request, item);
-
- await item.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
-
+ // Do this first so that metadata savers can pull the updates from the database.
if (request.People != null)
{
await _libraryManager.UpdatePeople(item, request.People.Select(x => new PersonInfo { Name = x.Name, Role = x.Role, Type = x.Type }).ToList());
}
+ UpdateItem(request, item);
+
+ await item.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
+
if (isLockedChanged && item.IsFolder)
{
var folder = (Folder)item;
@@ -243,7 +244,6 @@ namespace MediaBrowser.Api
item.DisplayMediaType = request.DisplayMediaType;
item.CommunityRating = request.CommunityRating;
- item.VoteCount = request.VoteCount;
item.HomePageUrl = request.HomePageUrl;
item.IndexNumber = request.IndexNumber;
item.ParentIndexNumber = request.ParentIndexNumber;
diff --git a/MediaBrowser.Api/Library/LibraryService.cs b/MediaBrowser.Api/Library/LibraryService.cs
index 4e0bdc8a9..d9fc7143f 100644
--- a/MediaBrowser.Api/Library/LibraryService.cs
+++ b/MediaBrowser.Api/Library/LibraryService.cs
@@ -27,6 +27,7 @@ using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.Globalization;
using MediaBrowser.Model.Services;
+using MediaBrowser.Common.Extensions;
namespace MediaBrowser.Api.Library
{
@@ -675,7 +676,6 @@ namespace MediaBrowser.Api.Library
Limit = 0,
Recursive = true,
IsVirtualItem = false,
- SourceTypes = new[] { SourceType.Library },
IsFavorite = request.IsFavorite,
DtoOptions = new DtoOptions(false)
{
@@ -831,6 +831,11 @@ namespace MediaBrowser.Api.Library
: (Folder)_libraryManager.RootFolder)
: _libraryManager.GetItemById(request.Id);
+ if (item == null)
+ {
+ throw new ResourceNotFoundException("Item not found.");
+ }
+
while (item.ThemeSongIds.Count == 0 && request.InheritFromParent && item.GetParent() != null)
{
item = item.GetParent();
@@ -875,6 +880,11 @@ namespace MediaBrowser.Api.Library
: (Folder)_libraryManager.RootFolder)
: _libraryManager.GetItemById(request.Id);
+ if (item == null)
+ {
+ throw new ResourceNotFoundException("Item not found.");
+ }
+
while (item.ThemeVideoIds.Count == 0 && request.InheritFromParent && item.GetParent() != null)
{
item = item.GetParent();
diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs
index 3ffa26450..bbee36199 100644
--- a/MediaBrowser.Api/Playback/BaseStreamingService.cs
+++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs
@@ -783,7 +783,6 @@ namespace MediaBrowser.Api.Playback
state.OutputContainer = (container ?? string.Empty).TrimStart('.');
state.OutputAudioBitrate = EncodingHelper.GetAudioBitrateParam(state.Request, state.AudioStream);
- state.OutputAudioSampleRate = request.AudioSampleRate;
state.OutputAudioCodec = state.Request.AudioCodec;
diff --git a/MediaBrowser.Api/Playback/MediaInfoService.cs b/MediaBrowser.Api/Playback/MediaInfoService.cs
index 55fe738e8..bba8094b6 100644
--- a/MediaBrowser.Api/Playback/MediaInfoService.cs
+++ b/MediaBrowser.Api/Playback/MediaInfoService.cs
@@ -107,6 +107,13 @@ namespace MediaBrowser.Api.Playback
public async Task<object> Post(OpenMediaSource request)
{
+ var result = await OpenMediaSource(request).ConfigureAwait(false);
+
+ return ToOptimizedResult(result);
+ }
+
+ private async Task<LiveStreamResponse> OpenMediaSource(OpenMediaSource request)
+ {
var authInfo = _authContext.GetAuthorizationInfo(Request);
var result = await _mediaSourceManager.OpenLiveStream(request, CancellationToken.None).ConfigureAwait(false);
@@ -137,7 +144,7 @@ namespace MediaBrowser.Api.Playback
}
}
- return ToOptimizedResult(result);
+ return result;
}
public void Post(CloseMediaSource request)
@@ -172,6 +179,34 @@ namespace MediaBrowser.Api.Playback
SetDeviceSpecificData(request.Id, info, profile, authInfo, request.MaxStreamingBitrate ?? profile.MaxStreamingBitrate, request.StartTimeTicks ?? 0, mediaSourceId, request.AudioStreamIndex, request.SubtitleStreamIndex, request.MaxAudioChannels, request.UserId, request.EnableDirectPlay, request.ForceDirectPlayRemoteMediaSource, request.EnableDirectStream, request.EnableTranscoding, request.AllowVideoStreamCopy, request.AllowAudioStreamCopy);
}
+ if (request.AutoOpenLiveStream)
+ {
+ var mediaSource = string.IsNullOrWhiteSpace(request.MediaSourceId) ? info.MediaSources.FirstOrDefault() : info.MediaSources.FirstOrDefault(i => string.Equals(i.Id, request.MediaSourceId, StringComparison.Ordinal));
+
+ if (mediaSource != null && mediaSource.RequiresOpening && string.IsNullOrWhiteSpace(mediaSource.LiveStreamId))
+ {
+ var openStreamResult = await OpenMediaSource(new OpenMediaSource
+ {
+ AudioStreamIndex = request.AudioStreamIndex,
+ DeviceProfile = request.DeviceProfile,
+ EnableDirectPlay = request.EnableDirectPlay,
+ EnableDirectStream = request.EnableDirectStream,
+ ForceDirectPlayRemoteMediaSource = request.ForceDirectPlayRemoteMediaSource,
+ ItemId = request.Id,
+ MaxAudioChannels = request.MaxAudioChannels,
+ MaxStreamingBitrate = request.MaxStreamingBitrate,
+ PlaySessionId = info.PlaySessionId,
+ StartTimeTicks = request.StartTimeTicks,
+ SubtitleStreamIndex = request.SubtitleStreamIndex,
+ UserId = request.UserId,
+ OpenToken = mediaSource.OpenToken
+
+ }).ConfigureAwait(false);
+
+ info.MediaSources = new List<MediaSourceInfo> { openStreamResult.MediaSource };
+ }
+ }
+
return info;
}
@@ -322,6 +357,19 @@ namespace MediaBrowser.Api.Playback
mediaSource.SupportsTranscoding = false;
}
+ if (item is Audio)
+ {
+ Logger.Info("User policy for {0}. EnableAudioPlaybackTranscoding: {1}", user.Name, user.Policy.EnableAudioPlaybackTranscoding);
+ }
+ else
+ {
+ Logger.Info("User policy for {0}. EnablePlaybackRemuxing: {1} EnableVideoPlaybackTranscoding: {2} EnableAudioPlaybackTranscoding: {3}",
+ user.Name,
+ user.Policy.EnablePlaybackRemuxing,
+ user.Policy.EnableVideoPlaybackTranscoding,
+ user.Policy.EnableAudioPlaybackTranscoding);
+ }
+
if (mediaSource.SupportsDirectPlay)
{
if (mediaSource.IsRemote && forceDirectPlayRemoteMediaSource)
diff --git a/MediaBrowser.Api/Playback/StreamState.cs b/MediaBrowser.Api/Playback/StreamState.cs
index 1daca9e33..2cf7d81af 100644
--- a/MediaBrowser.Api/Playback/StreamState.cs
+++ b/MediaBrowser.Api/Playback/StreamState.cs
@@ -250,248 +250,6 @@ namespace MediaBrowser.Api.Playback
public DeviceProfile DeviceProfile { get; set; }
- public int? TotalOutputBitrate
- {
- get
- {
- return (OutputAudioBitrate ?? 0) + (OutputVideoBitrate ?? 0);
- }
- }
-
- public int? OutputWidth
- {
- get
- {
- if (VideoStream != null && VideoStream.Width.HasValue && VideoStream.Height.HasValue)
- {
- var size = new ImageSize
- {
- Width = VideoStream.Width.Value,
- Height = VideoStream.Height.Value
- };
-
- var newSize = DrawingUtils.Resize(size,
- VideoRequest.Width,
- VideoRequest.Height,
- VideoRequest.MaxWidth,
- VideoRequest.MaxHeight);
-
- return Convert.ToInt32(newSize.Width);
- }
-
- if (VideoRequest == null)
- {
- return null;
- }
-
- return VideoRequest.MaxWidth ?? VideoRequest.Width;
- }
- }
-
- public int? OutputHeight
- {
- get
- {
- if (VideoStream != null && VideoStream.Width.HasValue && VideoStream.Height.HasValue)
- {
- var size = new ImageSize
- {
- Width = VideoStream.Width.Value,
- Height = VideoStream.Height.Value
- };
-
- var newSize = DrawingUtils.Resize(size,
- VideoRequest.Width,
- VideoRequest.Height,
- VideoRequest.MaxWidth,
- VideoRequest.MaxHeight);
-
- return Convert.ToInt32(newSize.Height);
- }
-
- if (VideoRequest == null)
- {
- return null;
- }
-
- return VideoRequest.MaxHeight ?? VideoRequest.Height;
- }
- }
-
- /// <summary>
- /// Predicts the audio sample rate that will be in the output stream
- /// </summary>
- public int? TargetVideoBitDepth
- {
- get
- {
- var stream = VideoStream;
- return stream == null || !Request.Static ? null : stream.BitDepth;
- }
- }
-
- /// <summary>
- /// Gets the target reference frames.
- /// </summary>
- /// <value>The target reference frames.</value>
- public int? TargetRefFrames
- {
- get
- {
- var stream = VideoStream;
- return stream == null || !Request.Static ? null : stream.RefFrames;
- }
- }
-
- public int? TargetVideoStreamCount
- {
- get
- {
- if (Request.Static)
- {
- return GetMediaStreamCount(MediaStreamType.Video, int.MaxValue);
- }
- return GetMediaStreamCount(MediaStreamType.Video, 1);
- }
- }
-
- public int? TargetAudioStreamCount
- {
- get
- {
- if (Request.Static)
- {
- return GetMediaStreamCount(MediaStreamType.Audio, int.MaxValue);
- }
- return GetMediaStreamCount(MediaStreamType.Audio, 1);
- }
- }
-
- public bool? IsTargetAnamorphic
- {
- get
- {
- if (Request.Static)
- {
- return VideoStream == null ? null : VideoStream.IsAnamorphic;
- }
-
- return false;
- }
- }
-
- public bool? IsTargetInterlaced
- {
- get
- {
- if (Request.Static)
- {
- return VideoStream == null ? (bool?)null : VideoStream.IsInterlaced;
- }
-
- if (DeInterlace)
- {
- return false;
- }
-
- return VideoStream == null ? (bool?)null : VideoStream.IsInterlaced;
- }
- }
-
- private int? GetMediaStreamCount(MediaStreamType type, int limit)
- {
- var count = MediaSource.GetStreamCount(type);
-
- if (count.HasValue)
- {
- count = Math.Min(count.Value, limit);
- }
-
- return count;
- }
-
- /// <summary>
- /// Predicts the audio sample rate that will be in the output stream
- /// </summary>
- public float? TargetFramerate
- {
- get
- {
- var stream = VideoStream;
- var requestedFramerate = VideoRequest.MaxFramerate ?? VideoRequest.Framerate;
-
- return requestedFramerate.HasValue && !Request.Static
- ? requestedFramerate
- : stream == null ? null : stream.AverageFrameRate ?? stream.RealFrameRate;
- }
- }
-
- public TransportStreamTimestamp TargetTimestamp
- {
- get
- {
- var defaultValue = string.Equals(OutputContainer, "m2ts", StringComparison.OrdinalIgnoreCase) ?
- TransportStreamTimestamp.Valid :
- TransportStreamTimestamp.None;
-
- return !Request.Static
- ? defaultValue
- : InputTimestamp;
- }
- }
-
- /// <summary>
- /// Predicts the audio sample rate that will be in the output stream
- /// </summary>
- public int? TargetPacketLength
- {
- get
- {
- var stream = VideoStream;
- return !Request.Static
- ? null
- : stream == null ? null : stream.PacketLength;
- }
- }
-
- /// <summary>
- /// Predicts the audio sample rate that will be in the output stream
- /// </summary>
- public string TargetVideoProfile
- {
- get
- {
- var stream = VideoStream;
- return !string.IsNullOrEmpty(VideoRequest.Profile) && !Request.Static
- ? VideoRequest.Profile
- : stream == null ? null : stream.Profile;
- }
- }
-
- public string TargetVideoCodecTag
- {
- get
- {
- var stream = VideoStream;
- return !Request.Static
- ? null
- : stream == null ? null : stream.CodecTag;
- }
- }
-
- public bool? IsTargetAVC
- {
- get
- {
- if (Request.Static)
- {
- return VideoStream == null ? null : VideoStream.IsAVC;
- }
-
- return true;
- }
- }
-
public TranscodingJob TranscodingJob;
public override void ReportTranscodingProgress(TimeSpan? transcodingPosition, float? framerate, double? percentComplete, long? bytesTranscoded, int? bitRate)
{
diff --git a/MediaBrowser.Api/Session/SessionsService.cs b/MediaBrowser.Api/Session/SessionsService.cs
index a42441268..358d09c18 100644
--- a/MediaBrowser.Api/Session/SessionsService.cs
+++ b/MediaBrowser.Api/Session/SessionsService.cs
@@ -98,7 +98,7 @@ namespace MediaBrowser.Api.Session
[Route("/Sessions/{Id}/Playing/{Command}", "POST", Summary = "Issues a playstate command to a client")]
[Authenticated]
- public class SendPlaystateCommand : IReturnVoid
+ public class SendPlaystateCommand : PlaystateRequest, IReturnVoid
{
/// <summary>
/// Gets or sets the id.
@@ -106,19 +106,6 @@ namespace MediaBrowser.Api.Session
/// <value>The id.</value>
[ApiMember(Name = "Id", Description = "Session Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
public string Id { get; set; }
-
- /// <summary>
- /// Gets or sets the position to seek to
- /// </summary>
- [ApiMember(Name = "SeekPositionTicks", Description = "The position to seek to.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
- public long? SeekPositionTicks { get; set; }
-
- /// <summary>
- /// Gets or sets the play command.
- /// </summary>
- /// <value>The play command.</value>
- [ApiMember(Name = "Command", Description = "The command to send - stop, pause, unpause, nexttrack, previoustrack, seek, fullscreen.", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")]
- public PlaystateCommand Command { get; set; }
}
[Route("/Sessions/{Id}/System/{Command}", "POST", Summary = "Issues a system command to a client")]
@@ -414,13 +401,7 @@ namespace MediaBrowser.Api.Session
public void Post(SendPlaystateCommand request)
{
- var command = new PlaystateRequest
- {
- Command = request.Command,
- SeekPositionTicks = request.SeekPositionTicks
- };
-
- var task = _sessionManager.SendPlaystateCommand(GetSession(_sessionContext).Result.Id, request.Id, command, CancellationToken.None);
+ var task = _sessionManager.SendPlaystateCommand(GetSession(_sessionContext).Result.Id, request.Id, request, CancellationToken.None);
Task.WaitAll(task);
}
diff --git a/MediaBrowser.Api/StartupWizardService.cs b/MediaBrowser.Api/StartupWizardService.cs
index 2df6d225b..cd56b69bd 100644
--- a/MediaBrowser.Api/StartupWizardService.cs
+++ b/MediaBrowser.Api/StartupWizardService.cs
@@ -100,7 +100,6 @@ namespace MediaBrowser.Api
config.EnableSimpleArtistDetection = true;
config.EnableNormalizedItemByNameIds = true;
config.DisableLiveTvChannelUserDataName = true;
- config.EnableSimpleSortNameHandling = true;
}
public void Post(UpdateStartupConfiguration request)
diff --git a/MediaBrowser.Api/project.json b/MediaBrowser.Api/project.json
deleted file mode 100644
index fbbe9eaf3..000000000
--- a/MediaBrowser.Api/project.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "frameworks":{
- "netstandard1.6":{
- "dependencies":{
- "NETStandard.Library":"1.6.0",
- }
- },
- ".NETPortable,Version=v4.5,Profile=Profile7":{
- "buildOptions": {
- "define": [ ]
- },
- "frameworkAssemblies":{
-
- }
- }
- }
-} \ No newline at end of file
diff --git a/MediaBrowser.Common/MediaBrowser.Common.csproj b/MediaBrowser.Common/MediaBrowser.Common.csproj
index b24975dba..d561b634e 100644
--- a/MediaBrowser.Common/MediaBrowser.Common.csproj
+++ b/MediaBrowser.Common/MediaBrowser.Common.csproj
@@ -72,9 +72,6 @@
<Name>MediaBrowser.Model</Name>
</ProjectReference>
</ItemGroup>
- <ItemGroup>
- <None Include="project.json" />
- </ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
<PropertyGroup>
diff --git a/MediaBrowser.Common/Updates/GithubUpdater.cs b/MediaBrowser.Common/Updates/GithubUpdater.cs
index c5000391d..cc83e7c6e 100644
--- a/MediaBrowser.Common/Updates/GithubUpdater.cs
+++ b/MediaBrowser.Common/Updates/GithubUpdater.cs
@@ -58,7 +58,7 @@ namespace MediaBrowser.Common.Updates
}
else if (updateLevel == PackageVersionClass.Beta)
{
- obj = obj.Where(i => !i.prerelease || i.name.EndsWith("-beta", StringComparison.OrdinalIgnoreCase)).ToArray();
+ obj = obj.Where(i => i.prerelease && i.name.EndsWith("-beta", StringComparison.OrdinalIgnoreCase)).ToArray();
}
else if (updateLevel == PackageVersionClass.Dev)
{
@@ -81,7 +81,7 @@ namespace MediaBrowser.Common.Updates
{
if (updateLevel == PackageVersionClass.Beta)
{
- return !i.prerelease || i.name.EndsWith("-beta", StringComparison.OrdinalIgnoreCase);
+ return i.prerelease && i.name.EndsWith("-beta", StringComparison.OrdinalIgnoreCase);
}
if (updateLevel == PackageVersionClass.Dev)
{
diff --git a/MediaBrowser.Common/project.json b/MediaBrowser.Common/project.json
deleted file mode 100644
index fbbe9eaf3..000000000
--- a/MediaBrowser.Common/project.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "frameworks":{
- "netstandard1.6":{
- "dependencies":{
- "NETStandard.Library":"1.6.0",
- }
- },
- ".NETPortable,Version=v4.5,Profile=Profile7":{
- "buildOptions": {
- "define": [ ]
- },
- "frameworkAssemblies":{
-
- }
- }
- }
-} \ No newline at end of file
diff --git a/MediaBrowser.Controller/Channels/Channel.cs b/MediaBrowser.Controller/Channels/Channel.cs
index 35c2ea1aa..862c8e5ac 100644
--- a/MediaBrowser.Controller/Channels/Channel.cs
+++ b/MediaBrowser.Controller/Channels/Channel.cs
@@ -35,7 +35,6 @@ namespace MediaBrowser.Controller.Channels
public override SourceType SourceType
{
get { return SourceType.Channel; }
- set { }
}
protected override QueryResult<BaseItem> GetItemsInternal(InternalItemsQuery query)
diff --git a/MediaBrowser.Controller/Drawing/IImageEncoder.cs b/MediaBrowser.Controller/Drawing/IImageEncoder.cs
index 9b895587f..131d0bd9e 100644
--- a/MediaBrowser.Controller/Drawing/IImageEncoder.cs
+++ b/MediaBrowser.Controller/Drawing/IImageEncoder.cs
@@ -19,7 +19,7 @@ namespace MediaBrowser.Controller.Drawing
/// <summary>
/// Encodes the image.
/// </summary>
- string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, int quality, ImageProcessingOptions options, ImageFormat outputFormat);
+ string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, ImageOrientation? orientation, int quality, ImageProcessingOptions options, ImageFormat outputFormat);
/// <summary>
/// Creates the image collage.
diff --git a/MediaBrowser.Controller/Entities/AggregateFolder.cs b/MediaBrowser.Controller/Entities/AggregateFolder.cs
index fe8ac0919..e8ebbdb70 100644
--- a/MediaBrowser.Controller/Entities/AggregateFolder.cs
+++ b/MediaBrowser.Controller/Entities/AggregateFolder.cs
@@ -87,7 +87,7 @@ namespace MediaBrowser.Controller.Entities
private List<Guid> _childrenIds = null;
private readonly object _childIdsLock = new object();
- protected override IEnumerable<BaseItem> LoadChildren()
+ protected override List<BaseItem> LoadChildren()
{
lock (_childIdsLock)
{
diff --git a/MediaBrowser.Controller/Entities/Audio/Audio.cs b/MediaBrowser.Controller/Entities/Audio/Audio.cs
index 4d35531cb..873ac3104 100644
--- a/MediaBrowser.Controller/Entities/Audio/Audio.cs
+++ b/MediaBrowser.Controller/Entities/Audio/Audio.cs
@@ -131,7 +131,7 @@ namespace MediaBrowser.Controller.Entities.Audio
/// Creates the name of the sort.
/// </summary>
/// <returns>System.String.</returns>
- protected override string CreateSortNameInternal()
+ protected override string CreateSortName()
{
return (ParentIndexNumber != null ? ParentIndexNumber.Value.ToString("0000 - ") : "")
+ (IndexNumber != null ? IndexNumber.Value.ToString("0000 - ") : "") + Name;
diff --git a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
index b0b9493a5..4b232de49 100644
--- a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
+++ b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
@@ -90,7 +90,7 @@ namespace MediaBrowser.Controller.Entities.Audio
}
[IgnoreDataMember]
- protected override IEnumerable<BaseItem> ActualChildren
+ public override IEnumerable<BaseItem> Children
{
get
{
@@ -99,7 +99,7 @@ namespace MediaBrowser.Controller.Entities.Audio
return new List<BaseItem>();
}
- return base.ActualChildren;
+ return base.Children;
}
}
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index 346442f59..4efea94d8 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -54,7 +54,6 @@ namespace MediaBrowser.Controller.Entities
ImageInfos = new List<ItemImageInfo>();
InheritedTags = new List<string>();
ProductionLocations = new List<string>();
- SourceType = SourceType.Library;
}
public static readonly char[] SlugReplaceChars = { '?', '/', '&' };
@@ -187,15 +186,10 @@ namespace MediaBrowser.Controller.Entities
}
set
{
- var isSortNameDefault = IsSortNameDefault(SortName);
-
_name = value;
- if (isSortNameDefault)
- {
- // lazy load this again
- SortName = null;
- }
+ // lazy load this again
+ _sortName = null;
}
}
@@ -279,7 +273,18 @@ namespace MediaBrowser.Controller.Entities
public virtual string Path { get; set; }
[IgnoreDataMember]
- public virtual SourceType SourceType { get; set; }
+ public virtual SourceType SourceType
+ {
+ get
+ {
+ if (!string.IsNullOrWhiteSpace(ChannelId))
+ {
+ return SourceType.Channel;
+ }
+
+ return SourceType.Library;
+ }
+ }
/// <summary>
/// Returns the folder containing the item.
@@ -586,6 +591,7 @@ namespace MediaBrowser.Controller.Entities
}
}
+ private string _forcedSortName;
/// <summary>
/// Gets or sets the name of the forced sort.
/// </summary>
@@ -593,42 +599,8 @@ namespace MediaBrowser.Controller.Entities
[IgnoreDataMember]
public string ForcedSortName
{
- get
- {
- var sortName = SortName;
-
- if (string.IsNullOrWhiteSpace(sortName))
- {
- return null;
- }
-
- if (string.Equals(sortName, CreateSortName(), StringComparison.OrdinalIgnoreCase))
- {
- return null;
- }
-
- return sortName;
- }
- set
- {
- if (string.IsNullOrWhiteSpace(value))
- {
- SortName = null;
- }
- else
- {
- var newValue = CreateSortNameFromCustomValue(value);
-
- if (string.Equals(newValue, CreateSortName(), StringComparison.OrdinalIgnoreCase))
- {
- SortName = null;
- }
- else
- {
- SortName = newValue;
- }
- }
- }
+ get { return _forcedSortName; }
+ set { _forcedSortName = value; _sortName = null; }
}
private string _sortName;
@@ -643,7 +615,15 @@ namespace MediaBrowser.Controller.Entities
{
if (_sortName == null)
{
- _sortName = CreateSortName();
+ if (!string.IsNullOrWhiteSpace(ForcedSortName))
+ {
+ // Need the ToLower because that's what CreateSortName does
+ _sortName = ModifySortChunks(ForcedSortName).ToLower();
+ }
+ else
+ {
+ _sortName = CreateSortName();
+ }
}
return _sortName;
}
@@ -653,31 +633,6 @@ namespace MediaBrowser.Controller.Entities
}
}
- private string CreateSortNameFromCustomValue(string value)
- {
- return string.IsNullOrWhiteSpace(value) ? null : NormalizeCustomSortName(value);
- }
-
- protected virtual string NormalizeCustomSortName(string value)
- {
- if (ConfigurationManager.Configuration.EnableSimpleSortNameHandling)
- {
- return value.RemoveDiacritics().ToLower();
- }
-
- return ModifySortChunks(value).ToLower();
- }
-
- public bool IsSortNameDefault(string value)
- {
- if (string.IsNullOrWhiteSpace(value))
- {
- return true;
- }
-
- return string.Equals(CreateSortNameFromCustomValue(value), CreateSortName(), StringComparison.OrdinalIgnoreCase);
- }
-
public string GetInternalMetadataPath()
{
var basePath = ConfigurationManager.ApplicationPaths.InternalMetadataPath;
@@ -699,22 +654,14 @@ namespace MediaBrowser.Controller.Entities
return System.IO.Path.Combine(basePath, idString.Substring(0, 2), idString);
}
- protected string CreateSortName()
- {
- if (string.IsNullOrWhiteSpace(Name))
- {
- return null;
- }
-
- return CreateSortNameInternal();
- }
-
/// <summary>
/// Creates the name of the sort.
/// </summary>
/// <returns>System.String.</returns>
- protected virtual string CreateSortNameInternal()
+ protected virtual string CreateSortName()
{
+ if (Name == null) return null; //some items may not have name filled in properly
+
if (!EnableAlphaNumericSorting)
{
return Name.TrimStart();
@@ -952,13 +899,6 @@ namespace MediaBrowser.Controller.Entities
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>
@@ -1367,6 +1307,7 @@ namespace MediaBrowser.Controller.Entities
public void AfterMetadataRefresh()
{
+ _sortName = null;
}
/// <summary>
@@ -2253,6 +2194,8 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
public virtual bool BeforeMetadataRefresh()
{
+ _sortName = null;
+
var hasChanges = false;
if (string.IsNullOrEmpty(Name) && !string.IsNullOrEmpty(Path))
diff --git a/MediaBrowser.Controller/Entities/CollectionFolder.cs b/MediaBrowser.Controller/Entities/CollectionFolder.cs
index 0a5faa727..8bc23a581 100644
--- a/MediaBrowser.Controller/Entities/CollectionFolder.cs
+++ b/MediaBrowser.Controller/Entities/CollectionFolder.cs
@@ -311,12 +311,12 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
/// <value>The actual children.</value>
[IgnoreDataMember]
- protected override IEnumerable<BaseItem> ActualChildren
+ public override IEnumerable<BaseItem> Children
{
get { return GetActualChildren(); }
}
- private IEnumerable<BaseItem> GetActualChildren()
+ public IEnumerable<BaseItem> GetActualChildren()
{
return GetPhysicalFolders(true).SelectMany(c => c.Children);
}
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs
index 7566911a1..48c9b83aa 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -185,7 +185,7 @@ namespace MediaBrowser.Controller.Entities
item.Id = LibraryManager.GetNewItemId(item.Path, item.GetType());
}
- if (ActualChildren.Any(i => i.Id == item.Id))
+ if (Children.Any(i => i.Id == item.Id))
{
throw new ArgumentException(string.Format("A child with the Id {0} already exists.", item.Id));
}
@@ -243,7 +243,7 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
/// <value>The actual children.</value>
[IgnoreDataMember]
- protected virtual IEnumerable<BaseItem> ActualChildren
+ public virtual IEnumerable<BaseItem> Children
{
get
{
@@ -252,16 +252,6 @@ namespace MediaBrowser.Controller.Entities
}
/// <summary>
- /// thread-safe access to the actual children of this folder - without regard to user
- /// </summary>
- /// <value>The children.</value>
- [IgnoreDataMember]
- public IEnumerable<BaseItem> Children
- {
- get { return ActualChildren.ToList(); }
- }
-
- /// <summary>
/// thread-safe access to all recursive children of this folder - without regard to user
/// </summary>
/// <value>The recursive children.</value>
@@ -301,7 +291,7 @@ namespace MediaBrowser.Controller.Entities
/// Loads our children. Validation will occur externally.
/// We want this sychronous.
/// </summary>
- protected virtual IEnumerable<BaseItem> LoadChildren()
+ protected virtual List<BaseItem> LoadChildren()
{
//Logger.Debug("Loading children from {0} {1} {2}", GetType().Name, Id, Path);
//just load our children from the repo - the library will be validated and maintained in other processes
@@ -330,7 +320,9 @@ namespace MediaBrowser.Controller.Entities
{
var dictionary = new Dictionary<Guid, BaseItem>();
- foreach (var child in ActualChildren)
+ var childrenList = Children.ToList();
+
+ foreach (var child in childrenList)
{
var id = child.Id;
if (dictionary.ContainsKey(id))
@@ -466,7 +458,7 @@ namespace MediaBrowser.Controller.Entities
if (recursive)
{
- await ValidateSubFolders(ActualChildren.OfType<Folder>().ToList(), directoryService, progress, cancellationToken).ConfigureAwait(false);
+ await ValidateSubFolders(Children.ToList().OfType<Folder>().ToList(), directoryService, progress, cancellationToken).ConfigureAwait(false);
}
progress.Report(20);
@@ -494,7 +486,7 @@ namespace MediaBrowser.Controller.Entities
private async Task RefreshMetadataRecursive(MetadataRefreshOptions refreshOptions, bool recursive, IProgress<double> progress, CancellationToken cancellationToken)
{
- var children = ActualChildren.ToList();
+ var children = Children.ToList();
var percentages = new Dictionary<Guid, double>(children.Count);
var numComplete = 0;
@@ -668,7 +660,7 @@ namespace MediaBrowser.Controller.Entities
/// Get our children from the repo - stubbed for now
/// </summary>
/// <returns>IEnumerable{BaseItem}.</returns>
- protected IEnumerable<BaseItem> GetCachedChildren()
+ protected List<BaseItem> GetCachedChildren()
{
return ItemRepository.GetItemList(new InternalItemsQuery
{
diff --git a/MediaBrowser.Controller/Entities/IHasMetadata.cs b/MediaBrowser.Controller/Entities/IHasMetadata.cs
index aee58b445..62c67336c 100644
--- a/MediaBrowser.Controller/Entities/IHasMetadata.cs
+++ b/MediaBrowser.Controller/Entities/IHasMetadata.cs
@@ -26,7 +26,7 @@ namespace MediaBrowser.Controller.Entities
/// <value>The date last saved.</value>
DateTime DateLastSaved { get; set; }
- SourceType SourceType { get; set; }
+ SourceType SourceType { get; }
/// <summary>
/// Gets or sets the date last refreshed.
diff --git a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
index 743e7642e..4d96c082f 100644
--- a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
+++ b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
@@ -148,9 +148,8 @@ namespace MediaBrowser.Controller.Entities
}
public string[] PresetViews { get; set; }
- public SourceType[] SourceTypes { get; set; }
- public SourceType[] ExcludeSourceTypes { get; set; }
public TrailerType[] TrailerTypes { get; set; }
+ public SourceType[] SourceTypes { get; set; }
public DayOfWeek[] AirDays { get; set; }
public SeriesStatus[] SeriesStatuses { get; set; }
@@ -215,9 +214,8 @@ namespace MediaBrowser.Controller.Entities
ExcludeTags = new string[] { };
ExcludeInheritedTags = new string[] { };
PresetViews = new string[] { };
- SourceTypes = new SourceType[] { };
- ExcludeSourceTypes = new SourceType[] { };
TrailerTypes = new TrailerType[] { };
+ SourceTypes = new SourceType[] { };
AirDays = new DayOfWeek[] { };
SeriesStatuses = new SeriesStatus[] { };
OrderBy = new List<Tuple<string, SortOrder>>();
diff --git a/MediaBrowser.Controller/Entities/InternalPeopleQuery.cs b/MediaBrowser.Controller/Entities/InternalPeopleQuery.cs
index 2ba6842ca..05d23d986 100644
--- a/MediaBrowser.Controller/Entities/InternalPeopleQuery.cs
+++ b/MediaBrowser.Controller/Entities/InternalPeopleQuery.cs
@@ -11,13 +11,11 @@ namespace MediaBrowser.Controller.Entities
public int? MaxListOrder { get; set; }
public Guid AppearsInItemId { get; set; }
public string NameContains { get; set; }
- public SourceType[] SourceTypes { get; set; }
public InternalPeopleQuery()
{
PersonTypes = new List<string>();
ExcludePersonTypes = new List<string>();
- SourceTypes = new SourceType[] { };
}
}
}
diff --git a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
index efa85f3ae..406a99f8b 100644
--- a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
+++ b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
@@ -79,7 +79,7 @@ namespace MediaBrowser.Controller.Entities.Movies
return new List<BaseItem>();
}
- protected override IEnumerable<BaseItem> LoadChildren()
+ protected override List<BaseItem> LoadChildren()
{
if (IsLegacyBoxSet)
{
diff --git a/MediaBrowser.Controller/Entities/TV/Episode.cs b/MediaBrowser.Controller/Entities/TV/Episode.cs
index e963ab184..45b4de1b3 100644
--- a/MediaBrowser.Controller/Entities/TV/Episode.cs
+++ b/MediaBrowser.Controller/Entities/TV/Episode.cs
@@ -1,19 +1,19 @@
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Configuration;
-using MediaBrowser.Model.Entities;
-using System;
-using System.Collections.Generic;
-using System.Globalization;
-using System.Linq;
-using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Serialization;
-
-namespace MediaBrowser.Controller.Entities.TV
-{
- /// <summary>
- /// Class Episode
- /// </summary>
- public class Episode : Video, IHasTrailers, IHasLookupInfo<EpisodeInfo>, IHasSeries
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Configuration;
+using MediaBrowser.Model.Entities;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using MediaBrowser.Model.IO;
+using MediaBrowser.Model.Serialization;
+
+namespace MediaBrowser.Controller.Entities.TV
+{
+ /// <summary>
+ /// Class Episode
+ /// </summary>
+ public class Episode : Video, IHasTrailers, IHasLookupInfo<EpisodeInfo>, IHasSeries
{
public Episode()
{
@@ -26,35 +26,35 @@ namespace MediaBrowser.Controller.Entities.TV
public List<Guid> RemoteTrailerIds { get; set; }
public List<MediaUrl> RemoteTrailers { get; set; }
- /// <summary>
- /// Gets the season in which it aired.
- /// </summary>
- /// <value>The aired season.</value>
- public int? AirsBeforeSeasonNumber { get; set; }
- public int? AirsAfterSeasonNumber { get; set; }
- public int? AirsBeforeEpisodeNumber { get; set; }
-
- /// <summary>
- /// Gets or sets the DVD season number.
- /// </summary>
- /// <value>The DVD season number.</value>
- public int? DvdSeasonNumber { get; set; }
- /// <summary>
- /// Gets or sets the DVD episode number.
- /// </summary>
- /// <value>The DVD episode number.</value>
- public float? DvdEpisodeNumber { get; set; }
-
- /// <summary>
- /// Gets or sets the absolute episode number.
- /// </summary>
- /// <value>The absolute episode number.</value>
- public int? AbsoluteEpisodeNumber { get; set; }
-
- /// <summary>
- /// This is the ending episode number for double episodes.
- /// </summary>
- /// <value>The index number.</value>
+ /// <summary>
+ /// Gets the season in which it aired.
+ /// </summary>
+ /// <value>The aired season.</value>
+ public int? AirsBeforeSeasonNumber { get; set; }
+ public int? AirsAfterSeasonNumber { get; set; }
+ public int? AirsBeforeEpisodeNumber { get; set; }
+
+ /// <summary>
+ /// Gets or sets the DVD season number.
+ /// </summary>
+ /// <value>The DVD season number.</value>
+ public int? DvdSeasonNumber { get; set; }
+ /// <summary>
+ /// Gets or sets the DVD episode number.
+ /// </summary>
+ /// <value>The DVD episode number.</value>
+ public float? DvdEpisodeNumber { get; set; }
+
+ /// <summary>
+ /// Gets or sets the absolute episode number.
+ /// </summary>
+ /// <value>The absolute episode number.</value>
+ public int? AbsoluteEpisodeNumber { get; set; }
+
+ /// <summary>
+ /// This is the ending episode number for double episodes.
+ /// </summary>
+ /// <value>The index number.</value>
public int? IndexNumberEnd { get; set; }
public string FindSeriesSortName()
@@ -62,56 +62,56 @@ namespace MediaBrowser.Controller.Entities.TV
var series = Series;
return series == null ? SeriesName : series.SortName;
}
-
- [IgnoreDataMember]
- protected override bool SupportsOwnedItems
- {
- get
- {
- return IsStacked || MediaSourceCount > 1;
- }
+
+ [IgnoreDataMember]
+ protected override bool SupportsOwnedItems
+ {
+ get
+ {
+ return IsStacked || MediaSourceCount > 1;
+ }
}
[IgnoreDataMember]
public override bool SupportsInheritedParentImages
{
get { return true; }
- }
-
- [IgnoreDataMember]
- public int? AiredSeasonNumber
- {
- get
- {
- return AirsAfterSeasonNumber ?? AirsBeforeSeasonNumber ?? ParentIndexNumber;
- }
- }
-
- [IgnoreDataMember]
- public override Folder LatestItemsIndexContainer
- {
- get
- {
- return Series;
- }
- }
-
- [IgnoreDataMember]
- public override Guid? DisplayParentId
- {
- get
- {
- return SeasonId;
- }
- }
-
- [IgnoreDataMember]
- protected override bool EnableDefaultVideoUserDataKeys
- {
- get
- {
- return false;
- }
+ }
+
+ [IgnoreDataMember]
+ public int? AiredSeasonNumber
+ {
+ get
+ {
+ return AirsAfterSeasonNumber ?? AirsBeforeSeasonNumber ?? ParentIndexNumber;
+ }
+ }
+
+ [IgnoreDataMember]
+ public override Folder LatestItemsIndexContainer
+ {
+ get
+ {
+ return Series;
+ }
+ }
+
+ [IgnoreDataMember]
+ public override Guid? DisplayParentId
+ {
+ get
+ {
+ return SeasonId;
+ }
+ }
+
+ [IgnoreDataMember]
+ protected override bool EnableDefaultVideoUserDataKeys
+ {
+ get
+ {
+ return false;
+ }
}
public override double? GetDefaultPrimaryImageAspectRatio()
@@ -120,64 +120,64 @@ namespace MediaBrowser.Controller.Entities.TV
value /= 9;
return value;
- }
-
- public override List<string> GetUserDataKeys()
- {
- var list = base.GetUserDataKeys();
-
- var series = Series;
- if (series != null && ParentIndexNumber.HasValue && IndexNumber.HasValue)
- {
- var seriesUserDataKeys = series.GetUserDataKeys();
- var take = seriesUserDataKeys.Count;
- if (seriesUserDataKeys.Count > 1)
- {
- take--;
- }
- list.InsertRange(0, seriesUserDataKeys.Take(take).Select(i => i + ParentIndexNumber.Value.ToString("000") + IndexNumber.Value.ToString("000")));
- }
-
- return list;
- }
-
- /// <summary>
- /// This Episode's Series Instance
- /// </summary>
- /// <value>The series.</value>
- [IgnoreDataMember]
- public Series Series
- {
- get
- {
+ }
+
+ public override List<string> GetUserDataKeys()
+ {
+ var list = base.GetUserDataKeys();
+
+ var series = Series;
+ if (series != null && ParentIndexNumber.HasValue && IndexNumber.HasValue)
+ {
+ var seriesUserDataKeys = series.GetUserDataKeys();
+ var take = seriesUserDataKeys.Count;
+ if (seriesUserDataKeys.Count > 1)
+ {
+ take--;
+ }
+ list.InsertRange(0, seriesUserDataKeys.Take(take).Select(i => i + ParentIndexNumber.Value.ToString("000") + IndexNumber.Value.ToString("000")));
+ }
+
+ return list;
+ }
+
+ /// <summary>
+ /// This Episode's Series Instance
+ /// </summary>
+ /// <value>The series.</value>
+ [IgnoreDataMember]
+ public Series Series
+ {
+ get
+ {
var seriesId = SeriesId ?? FindSeriesId();
- return seriesId.HasValue ? (LibraryManager.GetItemById(seriesId.Value) as Series) : null;
- }
- }
-
- [IgnoreDataMember]
- public Season Season
- {
- get
- {
+ return seriesId.HasValue ? (LibraryManager.GetItemById(seriesId.Value) as Series) : null;
+ }
+ }
+
+ [IgnoreDataMember]
+ public Season Season
+ {
+ get
+ {
var seasonId = SeasonId ?? FindSeasonId();
- return seasonId.HasValue ? (LibraryManager.GetItemById(seasonId.Value) as Season) : null;
- }
- }
-
- [IgnoreDataMember]
- public bool IsInSeasonFolder
- {
- get
- {
- return FindParent<Season>() != null;
- }
+ return seasonId.HasValue ? (LibraryManager.GetItemById(seasonId.Value) as Season) : null;
+ }
+ }
+
+ [IgnoreDataMember]
+ public bool IsInSeasonFolder
+ {
+ get
+ {
+ return FindParent<Season>() != null;
+ }
}
[IgnoreDataMember]
public string SeriesPresentationUniqueKey { get; set; }
-
- [IgnoreDataMember]
+
+ [IgnoreDataMember]
public string SeriesName { get; set; }
[IgnoreDataMember]
@@ -187,17 +187,17 @@ namespace MediaBrowser.Controller.Entities.TV
{
var series = Series;
return series == null ? null : series.PresentationUniqueKey;
- }
-
- public string FindSeasonName()
+ }
+
+ public string FindSeasonName()
{
- var season = Season;
-
- if (season == null)
- {
- if (ParentIndexNumber.HasValue)
- {
- return "Season " + ParentIndexNumber.Value.ToString(CultureInfo.InvariantCulture);
+ var season = Season;
+
+ if (season == null)
+ {
+ if (ParentIndexNumber.HasValue)
+ {
+ return "Season " + ParentIndexNumber.Value.ToString(CultureInfo.InvariantCulture);
}
return "Season Unknown";
}
@@ -231,92 +231,92 @@ namespace MediaBrowser.Controller.Entities.TV
}
return season == null ? (Guid?)null : season.Id;
- }
-
- /// <summary>
- /// Creates the name of the sort.
- /// </summary>
- /// <returns>System.String.</returns>
- protected override string CreateSortNameInternal()
- {
- return (ParentIndexNumber != null ? ParentIndexNumber.Value.ToString("000 - ") : "")
- + (IndexNumber != null ? IndexNumber.Value.ToString("0000 - ") : "") + Name;
- }
-
- /// <summary>
- /// Determines whether [contains episode number] [the specified number].
- /// </summary>
- /// <param name="number">The number.</param>
- /// <returns><c>true</c> if [contains episode number] [the specified number]; otherwise, <c>false</c>.</returns>
- public bool ContainsEpisodeNumber(int number)
- {
- if (IndexNumber.HasValue)
- {
- if (IndexNumberEnd.HasValue)
- {
- return number >= IndexNumber.Value && number <= IndexNumberEnd.Value;
- }
-
- return IndexNumber.Value == number;
- }
-
- return false;
- }
-
- [IgnoreDataMember]
- public override bool SupportsRemoteImageDownloading
- {
- get
- {
- if (IsMissingEpisode)
- {
- return false;
- }
-
- return true;
- }
- }
-
- [IgnoreDataMember]
- public bool IsMissingEpisode
- {
- get
- {
- return LocationType == LocationType.Virtual && !IsUnaired;
- }
- }
-
- [IgnoreDataMember]
- public bool IsVirtualUnaired
- {
- get { return LocationType == LocationType.Virtual && IsUnaired; }
- }
-
- [IgnoreDataMember]
+ }
+
+ /// <summary>
+ /// Creates the name of the sort.
+ /// </summary>
+ /// <returns>System.String.</returns>
+ protected override string CreateSortName()
+ {
+ return (ParentIndexNumber != null ? ParentIndexNumber.Value.ToString("000 - ") : "")
+ + (IndexNumber != null ? IndexNumber.Value.ToString("0000 - ") : "") + Name;
+ }
+
+ /// <summary>
+ /// Determines whether [contains episode number] [the specified number].
+ /// </summary>
+ /// <param name="number">The number.</param>
+ /// <returns><c>true</c> if [contains episode number] [the specified number]; otherwise, <c>false</c>.</returns>
+ public bool ContainsEpisodeNumber(int number)
+ {
+ if (IndexNumber.HasValue)
+ {
+ if (IndexNumberEnd.HasValue)
+ {
+ return number >= IndexNumber.Value && number <= IndexNumberEnd.Value;
+ }
+
+ return IndexNumber.Value == number;
+ }
+
+ return false;
+ }
+
+ [IgnoreDataMember]
+ public override bool SupportsRemoteImageDownloading
+ {
+ get
+ {
+ if (IsMissingEpisode)
+ {
+ return false;
+ }
+
+ return true;
+ }
+ }
+
+ [IgnoreDataMember]
+ public bool IsMissingEpisode
+ {
+ get
+ {
+ return LocationType == LocationType.Virtual && !IsUnaired;
+ }
+ }
+
+ [IgnoreDataMember]
+ public bool IsVirtualUnaired
+ {
+ get { return LocationType == LocationType.Virtual && IsUnaired; }
+ }
+
+ [IgnoreDataMember]
public Guid? SeasonId { get; set; }
[IgnoreDataMember]
public Guid? SeriesId { get; set; }
public Guid? FindSeriesId()
{
- var series = FindParent<Series>();
+ var series = FindParent<Series>();
return series == null ? (Guid?)null : series.Id;
- }
-
- public override IEnumerable<Guid> GetAncestorIds()
- {
- var list = base.GetAncestorIds().ToList();
-
- var seasonId = SeasonId;
-
- if (seasonId.HasValue && !list.Contains(seasonId.Value))
- {
- list.Add(seasonId.Value);
- }
-
- return list;
- }
-
+ }
+
+ public override IEnumerable<Guid> GetAncestorIds()
+ {
+ var list = base.GetAncestorIds().ToList();
+
+ var seasonId = SeasonId;
+
+ if (seasonId.HasValue && !list.Contains(seasonId.Value))
+ {
+ list.Add(seasonId.Value);
+ }
+
+ return list;
+ }
+
public override IEnumerable<FileSystemMetadata> GetDeletePaths()
{
return new[] {
@@ -327,60 +327,60 @@ namespace MediaBrowser.Controller.Entities.TV
}
}.Concat(GetLocalMetadataFilesToDelete());
}
-
- public override UnratedItem GetBlockUnratedType()
- {
- return UnratedItem.Series;
- }
-
- public EpisodeInfo GetLookupInfo()
- {
- var id = GetItemLookupInfo<EpisodeInfo>();
-
- var series = Series;
-
- if (series != null)
- {
- id.SeriesProviderIds = series.ProviderIds;
- }
-
- id.IsMissingEpisode = IsMissingEpisode;
- id.IndexNumberEnd = IndexNumberEnd;
- id.IsVirtualUnaired = IsVirtualUnaired;
-
- return id;
- }
-
- public override bool BeforeMetadataRefresh()
- {
- var hasChanges = base.BeforeMetadataRefresh();
-
- try
- {
- if (LibraryManager.FillMissingEpisodeNumbersFromPath(this))
- {
- hasChanges = true;
- }
- }
- catch (Exception ex)
- {
- Logger.ErrorException("Error in FillMissingEpisodeNumbersFromPath. Episode: {0}", ex, Path ?? Name ?? Id.ToString());
- }
-
- if (!ParentIndexNumber.HasValue)
- {
- var season = Season;
- if (season != null)
- {
- if (season.ParentIndexNumber.HasValue)
- {
- ParentIndexNumber = season.ParentIndexNumber;
- hasChanges = true;
- }
- }
- }
-
- return hasChanges;
- }
- }
-}
+
+ public override UnratedItem GetBlockUnratedType()
+ {
+ return UnratedItem.Series;
+ }
+
+ public EpisodeInfo GetLookupInfo()
+ {
+ var id = GetItemLookupInfo<EpisodeInfo>();
+
+ var series = Series;
+
+ if (series != null)
+ {
+ id.SeriesProviderIds = series.ProviderIds;
+ }
+
+ id.IsMissingEpisode = IsMissingEpisode;
+ id.IndexNumberEnd = IndexNumberEnd;
+ id.IsVirtualUnaired = IsVirtualUnaired;
+
+ return id;
+ }
+
+ public override bool BeforeMetadataRefresh()
+ {
+ var hasChanges = base.BeforeMetadataRefresh();
+
+ try
+ {
+ if (LibraryManager.FillMissingEpisodeNumbersFromPath(this))
+ {
+ hasChanges = true;
+ }
+ }
+ catch (Exception ex)
+ {
+ Logger.ErrorException("Error in FillMissingEpisodeNumbersFromPath. Episode: {0}", ex, Path ?? Name ?? Id.ToString());
+ }
+
+ if (!ParentIndexNumber.HasValue)
+ {
+ var season = Season;
+ if (season != null)
+ {
+ if (season.ParentIndexNumber.HasValue)
+ {
+ ParentIndexNumber = season.ParentIndexNumber;
+ hasChanges = true;
+ }
+ }
+ }
+
+ return hasChanges;
+ }
+ }
+}
diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs
index 4ccf6d623..17494eb08 100644
--- a/MediaBrowser.Controller/Entities/TV/Season.cs
+++ b/MediaBrowser.Controller/Entities/TV/Season.cs
@@ -145,7 +145,7 @@ namespace MediaBrowser.Controller.Entities.TV
/// Creates the name of the sort.
/// </summary>
/// <returns>System.String.</returns>
- protected override string CreateSortNameInternal()
+ protected override string CreateSortName()
{
return IndexNumber != null ? IndexNumber.Value.ToString("0000") : Name;
}
diff --git a/MediaBrowser.Controller/Entities/UserRootFolder.cs b/MediaBrowser.Controller/Entities/UserRootFolder.cs
index c93c81401..3e4931e77 100644
--- a/MediaBrowser.Controller/Entities/UserRootFolder.cs
+++ b/MediaBrowser.Controller/Entities/UserRootFolder.cs
@@ -18,7 +18,7 @@ namespace MediaBrowser.Controller.Entities
{
private List<Guid> _childrenIds = null;
private readonly object _childIdsLock = new object();
- protected override IEnumerable<BaseItem> LoadChildren()
+ protected override List<BaseItem> LoadChildren()
{
lock (_childIdsLock)
{
diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs
index fb31d9a47..b6887940e 100644
--- a/MediaBrowser.Controller/Entities/Video.cs
+++ b/MediaBrowser.Controller/Entities/Video.cs
@@ -633,14 +633,17 @@ namespace MediaBrowser.Controller.Entities
if (info.Path.StartsWith("Http", StringComparison.OrdinalIgnoreCase))
{
info.Protocol = MediaProtocol.Http;
+ info.SupportsDirectStream = false;
}
else if (info.Path.StartsWith("Rtmp", StringComparison.OrdinalIgnoreCase))
{
info.Protocol = MediaProtocol.Rtmp;
+ info.SupportsDirectStream = false;
}
else if (info.Path.StartsWith("Rtsp", StringComparison.OrdinalIgnoreCase))
{
info.Protocol = MediaProtocol.Rtsp;
+ info.SupportsDirectStream = false;
}
else
{
diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs
index 3f6b5a806..5a702b4f0 100644
--- a/MediaBrowser.Controller/Library/ILibraryManager.cs
+++ b/MediaBrowser.Controller/Library/ILibraryManager.cs
@@ -527,6 +527,8 @@ namespace MediaBrowser.Controller.Library
/// <returns>QueryResult&lt;BaseItem&gt;.</returns>
IEnumerable<BaseItem> GetItemList(InternalItemsQuery query);
+ IEnumerable<BaseItem> GetItemList(InternalItemsQuery query, bool allowExternalContent);
+
/// <summary>
/// Gets the items.
/// </summary>
diff --git a/MediaBrowser.Controller/Library/PlaybackProgressEventArgs.cs b/MediaBrowser.Controller/Library/PlaybackProgressEventArgs.cs
index 0644719b6..9f98182ba 100644
--- a/MediaBrowser.Controller/Library/PlaybackProgressEventArgs.cs
+++ b/MediaBrowser.Controller/Library/PlaybackProgressEventArgs.cs
@@ -1,5 +1,5 @@
using MediaBrowser.Controller.Entities;
-using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Dto;
using System;
using System.Collections.Generic;
@@ -13,7 +13,7 @@ namespace MediaBrowser.Controller.Library
public List<User> Users { get; set; }
public long? PlaybackPositionTicks { get; set; }
public BaseItem Item { get; set; }
- public BaseItemInfo MediaInfo { get; set; }
+ public BaseItemDto MediaInfo { get; set; }
public string MediaSourceId { get; set; }
public bool IsPaused { get; set; }
public bool IsAutomated { get; set; }
diff --git a/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs b/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs
index 8501f1580..45786e795 100644
--- a/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs
+++ b/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs
@@ -43,7 +43,6 @@ namespace MediaBrowser.Controller.LiveTv
public override SourceType SourceType
{
get { return SourceType.LiveTV; }
- set { }
}
[IgnoreDataMember]
diff --git a/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs b/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs
index 34a9103f8..898ea9ff4 100644
--- a/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs
+++ b/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs
@@ -55,7 +55,6 @@ namespace MediaBrowser.Controller.LiveTv
public override SourceType SourceType
{
get { return SourceType.LiveTV; }
- set { }
}
[IgnoreDataMember]
@@ -89,7 +88,7 @@ namespace MediaBrowser.Controller.LiveTv
}
}
- protected override string CreateSortNameInternal()
+ protected override string CreateSortName()
{
if (!string.IsNullOrEmpty(Number))
{
diff --git a/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs b/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs
index 5919d87fd..665640dfd 100644
--- a/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs
+++ b/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs
@@ -65,7 +65,6 @@ namespace MediaBrowser.Controller.LiveTv
public override SourceType SourceType
{
get { return SourceType.LiveTV; }
- set { }
}
/// <summary>
diff --git a/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs b/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs
index 18894120a..2b527c4b0 100644
--- a/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs
+++ b/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs
@@ -42,7 +42,6 @@ namespace MediaBrowser.Controller.LiveTv
public override SourceType SourceType
{
get { return SourceType.LiveTV; }
- set { }
}
[IgnoreDataMember]
diff --git a/MediaBrowser.Controller/LiveTv/ProgramInfo.cs b/MediaBrowser.Controller/LiveTv/ProgramInfo.cs
index d0377fbfd..b0e636d77 100644
--- a/MediaBrowser.Controller/LiveTv/ProgramInfo.cs
+++ b/MediaBrowser.Controller/LiveTv/ProgramInfo.cs
@@ -107,8 +107,12 @@ namespace MediaBrowser.Controller.LiveTv
/// <value>The image URL.</value>
public string ImageUrl { get; set; }
+ public string ThumbImageUrl { get; set; }
+
public string LogoImageUrl { get; set; }
+ public string BackdropImageUrl { get; set; }
+
/// <summary>
/// Gets or sets a value indicating whether this instance has image.
/// </summary>
diff --git a/MediaBrowser.Controller/LiveTv/RecordingGroup.cs b/MediaBrowser.Controller/LiveTv/RecordingGroup.cs
index 8093b5a76..b54ca8974 100644
--- a/MediaBrowser.Controller/LiveTv/RecordingGroup.cs
+++ b/MediaBrowser.Controller/LiveTv/RecordingGroup.cs
@@ -30,7 +30,6 @@ namespace MediaBrowser.Controller.LiveTv
public override SourceType SourceType
{
get { return SourceType.LiveTV; }
- set { }
}
}
}
diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
index e15b58e77..348cfd343 100644
--- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj
+++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
@@ -37,10 +37,6 @@
<RunPostBuildEvent>Always</RunPostBuildEvent>
</PropertyGroup>
<ItemGroup>
- <None Include="project.json" />
- <!-- A reference to the entire .NET Framework is automatically included -->
- </ItemGroup>
- <ItemGroup>
<Compile Include="..\SharedVersion.cs">
<Link>Properties\SharedVersion.cs</Link>
</Compile>
diff --git a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs
index 54a361ff7..c348ffda7 100644
--- a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs
+++ b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs
@@ -1604,7 +1604,7 @@ namespace MediaBrowser.Controller.MediaEncoding
}
// Only do this for video files due to sometimes unpredictable codec names coming from BDInfo
- if (state.RunTimeTicks.HasValue && state.VideoType == VideoType.VideoFile && string.IsNullOrWhiteSpace(encodingOptions.HardwareAccelerationType))
+ if (state.VideoType == VideoType.VideoFile && state.RunTimeTicks.HasValue && string.IsNullOrWhiteSpace(encodingOptions.HardwareAccelerationType))
{
foreach (var stream in state.MediaSource.MediaStreams)
{
@@ -1806,6 +1806,20 @@ namespace MediaBrowser.Controller.MediaEncoding
break;
}
}
+
+ else if (string.Equals(encodingOptions.HardwareAccelerationType, "nvenc", StringComparison.OrdinalIgnoreCase))
+ {
+ switch (state.MediaSource.VideoStream.Codec.ToLower())
+ {
+ case "avc":
+ case "h264":
+ if (_mediaEncoder.SupportsDecoder("h264_cuvid"))
+ {
+ return "-c:v h264_cuvid ";
+ }
+ break;
+ }
+ }
}
// leave blank so ffmpeg will decide
diff --git a/MediaBrowser.Controller/MediaEncoding/EncodingJobInfo.cs b/MediaBrowser.Controller/MediaEncoding/EncodingJobInfo.cs
index 9b89e8f5a..57c81ddf7 100644
--- a/MediaBrowser.Controller/MediaEncoding/EncodingJobInfo.cs
+++ b/MediaBrowser.Controller/MediaEncoding/EncodingJobInfo.cs
@@ -8,6 +8,7 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.MediaInfo;
+using MediaBrowser.Model.Drawing;
namespace MediaBrowser.Controller.MediaEncoding
{
@@ -134,7 +135,6 @@ namespace MediaBrowser.Controller.MediaEncoding
public int? OutputAudioBitrate;
public int? OutputAudioChannels;
- public int? OutputAudioSampleRate;
public bool DeInterlace { get; set; }
public bool IsVideoRequest { get; set; }
public TranscodingJobType TranscodingType { get; set; }
@@ -173,6 +173,97 @@ namespace MediaBrowser.Controller.MediaEncoding
return false;
}
+ public int? TotalOutputBitrate
+ {
+ get
+ {
+ return (OutputAudioBitrate ?? 0) + (OutputVideoBitrate ?? 0);
+ }
+ }
+
+ public int? OutputWidth
+ {
+ get
+ {
+ if (VideoStream != null && VideoStream.Width.HasValue && VideoStream.Height.HasValue)
+ {
+ var size = new ImageSize
+ {
+ Width = VideoStream.Width.Value,
+ Height = VideoStream.Height.Value
+ };
+
+ var newSize = DrawingUtils.Resize(size,
+ BaseRequest.Width,
+ BaseRequest.Height,
+ BaseRequest.MaxWidth,
+ BaseRequest.MaxHeight);
+
+ return Convert.ToInt32(newSize.Width);
+ }
+
+ if (!IsVideoRequest)
+ {
+ return null;
+ }
+
+ return BaseRequest.MaxWidth ?? BaseRequest.Width;
+ }
+ }
+
+ public int? OutputHeight
+ {
+ get
+ {
+ if (VideoStream != null && VideoStream.Width.HasValue && VideoStream.Height.HasValue)
+ {
+ var size = new ImageSize
+ {
+ Width = VideoStream.Width.Value,
+ Height = VideoStream.Height.Value
+ };
+
+ var newSize = DrawingUtils.Resize(size,
+ BaseRequest.Width,
+ BaseRequest.Height,
+ BaseRequest.MaxWidth,
+ BaseRequest.MaxHeight);
+
+ return Convert.ToInt32(newSize.Height);
+ }
+
+ if (!IsVideoRequest)
+ {
+ return null;
+ }
+
+ return BaseRequest.MaxHeight ?? BaseRequest.Height;
+ }
+ }
+
+ public int? OutputAudioSampleRate
+ {
+ get
+ {
+ if (BaseRequest.Static || string.Equals(OutputAudioCodec, "copy", StringComparison.OrdinalIgnoreCase))
+ {
+ if (AudioStream != null)
+ {
+ return AudioStream.SampleRate;
+ }
+ }
+
+ else if (BaseRequest.AudioSampleRate.HasValue)
+ {
+ // Don't exceed what the encoder supports
+ // Seeing issues of attempting to encode to 88200
+ return Math.Min(44100, BaseRequest.AudioSampleRate.Value);
+ }
+
+ return null;
+ }
+ }
+
/// <summary>
/// Predicts the audio sample rate that will be in the output stream
/// </summary>
@@ -189,6 +280,180 @@ namespace MediaBrowser.Controller.MediaEncoding
}
}
+ /// <summary>
+ /// Predicts the audio sample rate that will be in the output stream
+ /// </summary>
+ public int? TargetVideoBitDepth
+ {
+ get
+ {
+ var stream = VideoStream;
+ return stream == null || !BaseRequest.Static ? null : stream.BitDepth;
+ }
+ }
+
+ /// <summary>
+ /// Gets the target reference frames.
+ /// </summary>
+ /// <value>The target reference frames.</value>
+ public int? TargetRefFrames
+ {
+ get
+ {
+ var stream = VideoStream;
+ return stream == null || !BaseRequest.Static ? null : stream.RefFrames;
+ }
+ }
+
+ /// <summary>
+ /// Predicts the audio sample rate that will be in the output stream
+ /// </summary>
+ public float? TargetFramerate
+ {
+ get
+ {
+ var stream = VideoStream;
+ var requestedFramerate = BaseRequest.MaxFramerate ?? BaseRequest.Framerate;
+
+ return requestedFramerate.HasValue && !BaseRequest.Static
+ ? requestedFramerate
+ : stream == null ? null : stream.AverageFrameRate ?? stream.RealFrameRate;
+ }
+ }
+
+ public TransportStreamTimestamp TargetTimestamp
+ {
+ get
+ {
+ var defaultValue = string.Equals(OutputContainer, "m2ts", StringComparison.OrdinalIgnoreCase) ?
+ TransportStreamTimestamp.Valid :
+ TransportStreamTimestamp.None;
+
+ return !BaseRequest.Static
+ ? defaultValue
+ : InputTimestamp;
+ }
+ }
+
+ /// <summary>
+ /// Predicts the audio sample rate that will be in the output stream
+ /// </summary>
+ public int? TargetPacketLength
+ {
+ get
+ {
+ var stream = VideoStream;
+ return !BaseRequest.Static
+ ? null
+ : stream == null ? null : stream.PacketLength;
+ }
+ }
+
+ /// <summary>
+ /// Predicts the audio sample rate that will be in the output stream
+ /// </summary>
+ public string TargetVideoProfile
+ {
+ get
+ {
+ var stream = VideoStream;
+ return !string.IsNullOrEmpty(BaseRequest.Profile) && !BaseRequest.Static
+ ? BaseRequest.Profile
+ : stream == null ? null : stream.Profile;
+ }
+ }
+
+ public string TargetVideoCodecTag
+ {
+ get
+ {
+ var stream = VideoStream;
+ return !BaseRequest.Static
+ ? null
+ : stream == null ? null : stream.CodecTag;
+ }
+ }
+
+ public bool? IsTargetAnamorphic
+ {
+ get
+ {
+ if (BaseRequest.Static)
+ {
+ return VideoStream == null ? null : VideoStream.IsAnamorphic;
+ }
+
+ return false;
+ }
+ }
+
+ public bool? IsTargetInterlaced
+ {
+ get
+ {
+ if (BaseRequest.Static)
+ {
+ return VideoStream == null ? (bool?)null : VideoStream.IsInterlaced;
+ }
+
+ if (DeInterlace)
+ {
+ return false;
+ }
+
+ return VideoStream == null ? (bool?)null : VideoStream.IsInterlaced;
+ }
+ }
+
+ public bool? IsTargetAVC
+ {
+ get
+ {
+ if (BaseRequest.Static)
+ {
+ return VideoStream == null ? null : VideoStream.IsAVC;
+ }
+
+ return false;
+ }
+ }
+
+ public int? TargetVideoStreamCount
+ {
+ get
+ {
+ if (BaseRequest.Static)
+ {
+ return GetMediaStreamCount(MediaStreamType.Video, int.MaxValue);
+ }
+ return GetMediaStreamCount(MediaStreamType.Video, 1);
+ }
+ }
+
+ public int? TargetAudioStreamCount
+ {
+ get
+ {
+ if (BaseRequest.Static)
+ {
+ return GetMediaStreamCount(MediaStreamType.Audio, int.MaxValue);
+ }
+ return GetMediaStreamCount(MediaStreamType.Audio, 1);
+ }
+ }
+
+ private int? GetMediaStreamCount(MediaStreamType type, int limit)
+ {
+ var count = MediaSource.GetStreamCount(type);
+
+ if (count.HasValue)
+ {
+ count = Math.Min(count.Value, limit);
+ }
+
+ return count;
+ }
+
protected void DisposeIsoMount()
{
if (IsoMount != null)
diff --git a/MediaBrowser.Controller/Playlists/Playlist.cs b/MediaBrowser.Controller/Playlists/Playlist.cs
index 790e8e824..854f8d7a2 100644
--- a/MediaBrowser.Controller/Playlists/Playlist.cs
+++ b/MediaBrowser.Controller/Playlists/Playlist.cs
@@ -74,7 +74,7 @@ namespace MediaBrowser.Controller.Playlists
return true;
}
- protected override IEnumerable<BaseItem> LoadChildren()
+ protected override List<BaseItem> LoadChildren()
{
// Save a trip to the database
return new List<BaseItem>();
diff --git a/MediaBrowser.Controller/Session/ISessionManager.cs b/MediaBrowser.Controller/Session/ISessionManager.cs
index 956d4cc95..8d77e0747 100644
--- a/MediaBrowser.Controller/Session/ISessionManager.cs
+++ b/MediaBrowser.Controller/Session/ISessionManager.cs
@@ -1,7 +1,7 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Security;
-using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Events;
using MediaBrowser.Model.Session;
using MediaBrowser.Model.Users;
@@ -249,7 +249,7 @@ namespace MediaBrowser.Controller.Session
/// </summary>
/// <param name="sessionId">The session identifier.</param>
/// <param name="item">The item.</param>
- void ReportNowViewingItem(string sessionId, BaseItemInfo item);
+ void ReportNowViewingItem(string sessionId, BaseItemDto item);
/// <summary>
/// Authenticates the new session.
diff --git a/MediaBrowser.Controller/Session/SessionInfo.cs b/MediaBrowser.Controller/Session/SessionInfo.cs
index 5cef56d1c..f590d9aec 100644
--- a/MediaBrowser.Controller/Session/SessionInfo.cs
+++ b/MediaBrowser.Controller/Session/SessionInfo.cs
@@ -1,4 +1,4 @@
-using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Session;
using System;
using System.Collections.Generic;
@@ -100,13 +100,13 @@ namespace MediaBrowser.Controller.Session
/// Gets or sets the name of the now viewing item.
/// </summary>
/// <value>The name of the now viewing item.</value>
- public BaseItemInfo NowViewingItem { get; set; }
+ public BaseItemDto NowViewingItem { get; set; }
/// <summary>
/// Gets or sets the now playing item.
/// </summary>
/// <value>The now playing item.</value>
- public BaseItemInfo NowPlayingItem { get; set; }
+ public BaseItemDto NowPlayingItem { get; set; }
public BaseItem FullNowPlayingItem { get; set; }
diff --git a/MediaBrowser.Controller/project.json b/MediaBrowser.Controller/project.json
deleted file mode 100644
index fbbe9eaf3..000000000
--- a/MediaBrowser.Controller/project.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "frameworks":{
- "netstandard1.6":{
- "dependencies":{
- "NETStandard.Library":"1.6.0",
- }
- },
- ".NETPortable,Version=v4.5,Profile=Profile7":{
- "buildOptions": {
- "define": [ ]
- },
- "frameworkAssemblies":{
-
- }
- }
- }
-} \ No newline at end of file
diff --git a/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs b/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs
index fbb6b20f1..2b5858aec 100644
--- a/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs
+++ b/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs
@@ -40,27 +40,12 @@ namespace MediaBrowser.LocalMetadata.Images
{
var parentPath = _fileSystem.GetDirectoryName(item.Path);
- var parentPathFiles = directoryService.GetFileSystemEntries(parentPath)
+ var parentPathFiles = directoryService.GetFiles(parentPath)
.ToList();
var nameWithoutExtension = _fileSystem.GetFileNameWithoutExtension(item.Path);
- var files = GetFilesFromParentFolder(nameWithoutExtension, parentPathFiles);
-
- if (files.Count > 0)
- {
- return files;
- }
-
- var metadataPath = Path.Combine(parentPath, "metadata");
-
- if (parentPathFiles.Any(i => string.Equals(i.FullName, metadataPath, StringComparison.OrdinalIgnoreCase)))
- {
- var filesInMetadataFolder = _fileSystem.GetFiles(metadataPath, BaseItem.SupportedImageExtensions, false, false);
- return GetFilesFromParentFolder(nameWithoutExtension, filesInMetadataFolder);
- }
-
- return new List<LocalImageInfo>();
+ return GetFilesFromParentFolder(nameWithoutExtension, parentPathFiles);
}
private List<LocalImageInfo> GetFilesFromParentFolder(string filenameWithoutExtension, IEnumerable<FileSystemMetadata> parentPathFiles)
diff --git a/MediaBrowser.LocalMetadata/MediaBrowser.LocalMetadata.csproj b/MediaBrowser.LocalMetadata/MediaBrowser.LocalMetadata.csproj
index f7b7fa5f2..9a7371a66 100644
--- a/MediaBrowser.LocalMetadata/MediaBrowser.LocalMetadata.csproj
+++ b/MediaBrowser.LocalMetadata/MediaBrowser.LocalMetadata.csproj
@@ -44,24 +44,15 @@
<Compile Include="Images\LocalImageProvider.cs" />
<Compile Include="Parsers\BaseItemXmlParser.cs" />
<Compile Include="Parsers\BoxSetXmlParser.cs" />
- <Compile Include="Parsers\EpisodeXmlParser.cs" />
<Compile Include="Parsers\GameSystemXmlParser.cs" />
<Compile Include="Parsers\GameXmlParser.cs" />
- <Compile Include="Parsers\MovieXmlParser.cs" />
- <Compile Include="Parsers\MusicVideoXmlParser.cs" />
<Compile Include="Parsers\PlaylistXmlParser.cs" />
- <Compile Include="Parsers\SeriesXmlParser.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Providers\BoxSetXmlProvider.cs" />
- <Compile Include="Providers\EpisodeXmlProvider.cs" />
<Compile Include="Providers\FolderXmlProvider.cs" />
<Compile Include="Providers\GameSystemXmlProvider.cs" />
<Compile Include="Providers\GameXmlProvider.cs" />
- <Compile Include="Providers\MovieXmlProvider.cs" />
- <Compile Include="Providers\MusicVideoXmlProvider.cs" />
<Compile Include="Providers\PlaylistXmlProvider.cs" />
- <Compile Include="Providers\SeriesXmlProvider.cs" />
- <Compile Include="Providers\VideoXmlProvider.cs" />
<Compile Include="Savers\BaseXmlSaver.cs" />
<Compile Include="Savers\BoxSetXmlSaver.cs" />
<Compile Include="Savers\FolderXmlSaver.cs" />
diff --git a/MediaBrowser.LocalMetadata/Parsers/BaseItemXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/BaseItemXmlParser.cs
index 53327deca..2edccf8c8 100644
--- a/MediaBrowser.LocalMetadata/Parsers/BaseItemXmlParser.cs
+++ b/MediaBrowser.LocalMetadata/Parsers/BaseItemXmlParser.cs
@@ -598,20 +598,6 @@ namespace MediaBrowser.LocalMetadata.Parsers
break;
}
- case "VoteCount":
- {
- var val = reader.ReadElementContentAsString();
- if (!string.IsNullOrWhiteSpace(val))
- {
- int num;
-
- if (int.TryParse(val, NumberStyles.Integer, _usCulture, out num))
- {
- item.VoteCount = num;
- }
- }
- break;
- }
case "CollectionNumber":
var tmdbCollection = reader.ReadElementContentAsString();
if (!string.IsNullOrWhiteSpace(tmdbCollection))
diff --git a/MediaBrowser.LocalMetadata/Parsers/BoxSetXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/BoxSetXmlParser.cs
index 9dcfa2f76..a0f0e4476 100644
--- a/MediaBrowser.LocalMetadata/Parsers/BoxSetXmlParser.cs
+++ b/MediaBrowser.LocalMetadata/Parsers/BoxSetXmlParser.cs
@@ -17,9 +17,16 @@ namespace MediaBrowser.LocalMetadata.Parsers
{
case "CollectionItems":
- using (var subReader = reader.ReadSubtree())
+ if (!reader.IsEmptyElement)
{
- FetchFromCollectionItemsNode(subReader, item);
+ using (var subReader = reader.ReadSubtree())
+ {
+ FetchFromCollectionItemsNode(subReader, item);
+ }
+ }
+ else
+ {
+ reader.Read();
}
break;
@@ -45,15 +52,22 @@ namespace MediaBrowser.LocalMetadata.Parsers
{
case "CollectionItem":
{
- using (var subReader = reader.ReadSubtree())
+ if (!reader.IsEmptyElement)
{
- var child = GetLinkedChild(subReader);
-
- if (child != null)
+ using (var subReader = reader.ReadSubtree())
{
- list.Add(child);
+ var child = GetLinkedChild(subReader);
+
+ if (child != null)
+ {
+ list.Add(child);
+ }
}
}
+ else
+ {
+ reader.Read();
+ }
break;
}
diff --git a/MediaBrowser.LocalMetadata/Parsers/EpisodeXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/EpisodeXmlParser.cs
deleted file mode 100644
index 6aba137eb..000000000
--- a/MediaBrowser.LocalMetadata/Parsers/EpisodeXmlParser.cs
+++ /dev/null
@@ -1,271 +0,0 @@
-using MediaBrowser.Controller.Entities.TV;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Logging;
-using System;
-using System.Collections.Generic;
-using System.Globalization;
-using System.IO;
-using System.Threading;
-using System.Xml;
-
-using MediaBrowser.Controller.IO;
-using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Xml;
-
-namespace MediaBrowser.LocalMetadata.Parsers
-{
- /// <summary>
- /// Class EpisodeXmlParser
- /// </summary>
- public class EpisodeXmlParser : BaseItemXmlParser<Episode>
- {
- private List<LocalImageInfo> _imagesFound;
- private readonly IFileSystem _fileSystem;
-
- public EpisodeXmlParser(ILogger logger, IFileSystem fileSystem, IProviderManager providerManager, IXmlReaderSettingsFactory xmlSettings)
- : base(logger, providerManager, xmlSettings, fileSystem)
- {
- _fileSystem = fileSystem;
- }
-
- private string _xmlPath;
-
- public void Fetch(MetadataResult<Episode> item,
- List<LocalImageInfo> images,
- string metadataFile,
- CancellationToken cancellationToken)
- {
- _imagesFound = images;
- _xmlPath = metadataFile;
-
- Fetch(item, metadataFile, cancellationToken);
- }
-
- private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
-
- /// <summary>
- /// Fetches the data from XML node.
- /// </summary>
- /// <param name="reader">The reader.</param>
- /// <param name="result">The result.</param>
- protected override void FetchDataFromXmlNode(XmlReader reader, MetadataResult<Episode> result)
- {
- var item = result.Item;
-
- switch (reader.Name)
- {
- case "Episode":
-
- //MB generated metadata is within an "Episode" node
- using (var subTree = reader.ReadSubtree())
- {
- subTree.MoveToContent();
-
- // Loop through each element
- while (subTree.Read())
- {
- if (subTree.NodeType == XmlNodeType.Element)
- {
- FetchDataFromXmlNode(subTree, result);
- }
- }
-
- }
- break;
-
- case "filename":
- {
- var filename = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(filename))
- {
- // Strip off everything but the filename. Some metadata tools like MetaBrowser v1.0 will have an 'episodes' prefix
- // even though it's actually using the metadata folder.
- filename = Path.GetFileName(filename);
-
- var parentFolder = _fileSystem.GetDirectoryName(_xmlPath);
- filename = Path.Combine(parentFolder, filename);
- var file = _fileSystem.GetFileInfo(filename);
-
- if (file.Exists)
- {
- _imagesFound.Add(new LocalImageInfo
- {
- Type = ImageType.Primary,
- FileInfo = file
- });
- }
- }
- break;
- }
- case "SeasonNumber":
- {
- var number = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(number))
- {
- int num;
-
- if (int.TryParse(number, out num))
- {
- item.ParentIndexNumber = num;
- }
- }
- break;
- }
-
- case "EpisodeNumber":
- {
- var number = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(number))
- {
- int num;
-
- if (int.TryParse(number, out num))
- {
- item.IndexNumber = num;
- }
- }
- break;
- }
-
- case "EpisodeNumberEnd":
- {
- var number = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(number))
- {
- int num;
-
- if (int.TryParse(number, out num))
- {
- item.IndexNumberEnd = num;
- }
- }
- break;
- }
-
- case "absolute_number":
- {
- var val = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(val))
- {
- int rval;
-
- // int.TryParse is local aware, so it can be probamatic, force us culture
- if (int.TryParse(val, NumberStyles.Integer, UsCulture, out rval))
- {
- item.AbsoluteEpisodeNumber = rval;
- }
- }
-
- break;
- }
- case "DVD_episodenumber":
- {
- var number = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(number))
- {
- float num;
-
- if (float.TryParse(number, NumberStyles.Any, UsCulture, out num))
- {
- item.DvdEpisodeNumber = num;
- }
- }
- break;
- }
-
- case "DVD_season":
- {
- var number = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(number))
- {
- float num;
-
- if (float.TryParse(number, NumberStyles.Any, UsCulture, out num))
- {
- item.DvdSeasonNumber = Convert.ToInt32(num);
- }
- }
- break;
- }
-
- case "airsbefore_episode":
- {
- var val = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(val))
- {
- int rval;
-
- // int.TryParse is local aware, so it can be probamatic, force us culture
- if (int.TryParse(val, NumberStyles.Integer, UsCulture, out rval))
- {
- item.AirsBeforeEpisodeNumber = rval;
- }
- }
-
- break;
- }
-
- case "airsafter_season":
- {
- var val = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(val))
- {
- int rval;
-
- // int.TryParse is local aware, so it can be probamatic, force us culture
- if (int.TryParse(val, NumberStyles.Integer, UsCulture, out rval))
- {
- item.AirsAfterSeasonNumber = rval;
- }
- }
-
- break;
- }
-
- case "airsbefore_season":
- {
- var val = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(val))
- {
- int rval;
-
- // int.TryParse is local aware, so it can be probamatic, force us culture
- if (int.TryParse(val, NumberStyles.Integer, UsCulture, out rval))
- {
- item.AirsBeforeSeasonNumber = rval;
- }
- }
-
- break;
- }
-
- case "EpisodeName":
- {
- var name = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(name))
- {
- item.Name = name;
- }
- break;
- }
-
-
- default:
- base.FetchDataFromXmlNode(reader, result);
- break;
- }
- }
- }
-}
diff --git a/MediaBrowser.LocalMetadata/Parsers/MovieXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/MovieXmlParser.cs
deleted file mode 100644
index 08c895c43..000000000
--- a/MediaBrowser.LocalMetadata/Parsers/MovieXmlParser.cs
+++ /dev/null
@@ -1,65 +0,0 @@
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Entities.Movies;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Logging;
-using System.Xml;
-using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Xml;
-
-namespace MediaBrowser.LocalMetadata.Parsers
-{
- /// <summary>
- /// Class EpisodeXmlParser
- /// </summary>
- public class BaseVideoXmlParser<T> : BaseItemXmlParser<T>
- where T : Video
- {
- /// <summary>
- /// Fetches the data from XML node.
- /// </summary>
- /// <param name="reader">The reader.</param>
- /// <param name="result">The result.</param>
- protected override void FetchDataFromXmlNode(XmlReader reader, MetadataResult<T> result)
- {
- var item = result.Item;
-
- switch (reader.Name)
- {
- case "TmdbCollectionName":
- {
- var val = reader.ReadElementContentAsString();
- var movie = item as Movie;
-
- if (!string.IsNullOrWhiteSpace(val) && movie != null)
- {
- movie.CollectionName = val;
- }
-
- break;
- }
-
- default:
- base.FetchDataFromXmlNode(reader, result);
- break;
- }
- }
-
- public BaseVideoXmlParser(ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory, IFileSystem fileSystem) : base(logger, providerManager, xmlReaderSettingsFactory, fileSystem)
- {
- }
- }
-
- public class MovieXmlParser : BaseVideoXmlParser<Movie>
- {
- public MovieXmlParser(ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory, IFileSystem fileSystem) : base(logger, providerManager, xmlReaderSettingsFactory, fileSystem)
- {
- }
- }
-
- public class VideoXmlParser : BaseVideoXmlParser<Video>
- {
- public VideoXmlParser(ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory, IFileSystem fileSystem) : base(logger, providerManager, xmlReaderSettingsFactory, fileSystem)
- {
- }
- }
-}
diff --git a/MediaBrowser.LocalMetadata/Parsers/MusicVideoXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/MusicVideoXmlParser.cs
deleted file mode 100644
index f612d1108..000000000
--- a/MediaBrowser.LocalMetadata/Parsers/MusicVideoXmlParser.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Logging;
-using System;
-using System.Xml;
-using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Xml;
-
-namespace MediaBrowser.LocalMetadata.Parsers
-{
- public class MusicVideoXmlParser : BaseVideoXmlParser<MusicVideo>
- {
- /// <summary>
- /// Fetches the data from XML node.
- /// </summary>
- /// <param name="reader">The reader.</param>
- /// <param name="result">The result.</param>
- protected override void FetchDataFromXmlNode(XmlReader reader, MetadataResult<MusicVideo> result)
- {
- var item = result.Item;
-
- switch (reader.Name)
- {
- case "Artist":
- {
- var val = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(val))
- {
- var artists = val.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
- item.Artists.AddRange(artists);
- }
-
- break;
- }
-
- case "Album":
- item.Album = reader.ReadElementContentAsString();
- break;
-
- default:
- base.FetchDataFromXmlNode(reader, result);
- break;
- }
- }
-
- public MusicVideoXmlParser(ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory, IFileSystem fileSystem) : base(logger, providerManager, xmlReaderSettingsFactory, fileSystem)
- {
- }
- }
-}
diff --git a/MediaBrowser.LocalMetadata/Parsers/SeriesXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/SeriesXmlParser.cs
deleted file mode 100644
index f5352add7..000000000
--- a/MediaBrowser.LocalMetadata/Parsers/SeriesXmlParser.cs
+++ /dev/null
@@ -1,102 +0,0 @@
-using System;
-using System.Xml;
-using MediaBrowser.Controller.Entities.TV;
-using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.Xml;
-
-namespace MediaBrowser.LocalMetadata.Parsers
-{
- /// <summary>
- /// Class SeriesXmlParser
- /// </summary>
- public class SeriesXmlParser : BaseItemXmlParser<Series>
- {
- /// <summary>
- /// Fetches the data from XML node.
- /// </summary>
- /// <param name="reader">The reader.</param>
- /// <param name="result">The result.</param>
- protected override void FetchDataFromXmlNode(XmlReader reader, MetadataResult<Series> result)
- {
- var item = result.Item;
-
- switch (reader.Name)
- {
- case "Series":
- //MB generated metadata is within a "Series" node
- using (var subTree = reader.ReadSubtree())
- {
- subTree.MoveToContent();
-
- // Loop through each element
- while (subTree.Read())
- {
- if (subTree.NodeType == XmlNodeType.Element)
- {
- FetchDataFromXmlNode(subTree, result);
- }
- }
-
- }
- break;
-
- case "id":
- string id = reader.ReadElementContentAsString();
- if (!string.IsNullOrWhiteSpace(id))
- {
- item.SetProviderId(MetadataProviders.Tvdb, id);
- }
- break;
-
- case "Airs_DayOfWeek":
- {
- item.AirDays = TVUtils.GetAirDays(reader.ReadElementContentAsString());
- break;
- }
-
- case "Airs_Time":
- {
- var val = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(val))
- {
- item.AirTime = val;
- }
- break;
- }
-
- case "Status":
- {
- var status = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(status))
- {
- SeriesStatus seriesStatus;
- if (Enum.TryParse(status, true, out seriesStatus))
- {
- item.Status = seriesStatus;
- }
- else
- {
- Logger.Info("Unrecognized series status: " + status);
- }
- }
-
- break;
- }
-
- default:
- base.FetchDataFromXmlNode(reader, result);
- break;
- }
- }
-
- public SeriesXmlParser(ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory, IFileSystem fileSystem) : base(logger, providerManager, xmlReaderSettingsFactory, fileSystem)
- {
- }
- }
-}
diff --git a/MediaBrowser.LocalMetadata/Providers/EpisodeXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/EpisodeXmlProvider.cs
deleted file mode 100644
index fc936f780..000000000
--- a/MediaBrowser.LocalMetadata/Providers/EpisodeXmlProvider.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-using MediaBrowser.Controller.Entities.TV;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.LocalMetadata.Parsers;
-using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Logging;
-using System.Collections.Generic;
-using System.IO;
-using System.Threading;
-
-using MediaBrowser.Controller.IO;
-using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Xml;
-
-namespace MediaBrowser.LocalMetadata.Providers
-{
- public class EpisodeXmlProvider : BaseXmlProvider<Episode>
- {
- private readonly ILogger _logger;
- private readonly IProviderManager _providerManager;
- private readonly IXmlReaderSettingsFactory _xmlSettings;
-
- public EpisodeXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlSettings)
- : base(fileSystem)
- {
- _logger = logger;
- _providerManager = providerManager;
- _xmlSettings = xmlSettings;
- }
-
- protected override void Fetch(MetadataResult<Episode> result, string path, CancellationToken cancellationToken)
- {
- var images = new List<LocalImageInfo>();
- var chapters = new List<ChapterInfo>();
-
- new EpisodeXmlParser(_logger, FileSystem, _providerManager, _xmlSettings).Fetch(result, images, path, cancellationToken);
-
- result.Images = images;
- }
-
- protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)
- {
- var metadataPath = FileSystem.GetDirectoryName(info.Path);
- metadataPath = Path.Combine(metadataPath, "metadata");
-
- var metadataFile = Path.Combine(metadataPath, Path.ChangeExtension(Path.GetFileName(info.Path), ".xml"));
-
- return directoryService.GetFile(metadataFile);
- }
- }
-}
diff --git a/MediaBrowser.LocalMetadata/Providers/MovieXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/MovieXmlProvider.cs
deleted file mode 100644
index 572fa7f4c..000000000
--- a/MediaBrowser.LocalMetadata/Providers/MovieXmlProvider.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-using MediaBrowser.Controller.Entities.Movies;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.LocalMetadata.Parsers;
-using MediaBrowser.Model.Logging;
-using System.IO;
-using System.Threading;
-
-using MediaBrowser.Controller.IO;
-using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Xml;
-
-namespace MediaBrowser.LocalMetadata.Providers
-{
- public class MovieXmlProvider : BaseXmlProvider<Movie>
- {
- private readonly ILogger _logger;
- private readonly IProviderManager _providerManager;
- protected IXmlReaderSettingsFactory XmlReaderSettingsFactory { get; private set; }
-
- public MovieXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory)
- : base(fileSystem)
- {
- _logger = logger;
- _providerManager = providerManager;
- XmlReaderSettingsFactory = xmlReaderSettingsFactory;
- }
-
- protected override void Fetch(MetadataResult<Movie> result, string path, CancellationToken cancellationToken)
- {
- new MovieXmlParser(_logger, _providerManager, XmlReaderSettingsFactory, FileSystem).Fetch(result, path, cancellationToken);
- }
-
- protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)
- {
- return GetXmlFileInfo(info, FileSystem);
- }
-
- public static FileSystemMetadata GetXmlFileInfo(ItemInfo info, IFileSystem fileSystem)
- {
- var fileInfo = fileSystem.GetFileSystemInfo(info.Path);
-
- var directoryInfo = fileInfo.IsDirectory ? fileInfo : fileSystem.GetDirectoryInfo(fileSystem.GetDirectoryName(info.Path));
-
- var directoryPath = directoryInfo.FullName;
-
- var specificFile = Path.Combine(directoryPath, fileSystem.GetFileNameWithoutExtension(info.Path) + ".xml");
-
- var file = fileSystem.GetFileInfo(specificFile);
-
- // In a mixed folder, only {moviename}.xml is supported
- if (info.IsInMixedFolder)
- {
- return file;
- }
-
- // If in it's own folder, prefer movie.xml, but allow the specific file as well
- var movieFile = fileSystem.GetFileInfo(Path.Combine(directoryPath, "movie.xml"));
-
- return movieFile.Exists ? movieFile : file;
- }
- }
-}
diff --git a/MediaBrowser.LocalMetadata/Providers/MusicVideoXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/MusicVideoXmlProvider.cs
deleted file mode 100644
index f91e236f7..000000000
--- a/MediaBrowser.LocalMetadata/Providers/MusicVideoXmlProvider.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using System.Threading;
-
-using MediaBrowser.Model.IO;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.IO;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.LocalMetadata.Parsers;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.Xml;
-
-namespace MediaBrowser.LocalMetadata.Providers
-{
- class MusicVideoXmlProvider : BaseXmlProvider<MusicVideo>
- {
- private readonly ILogger _logger;
- private readonly IProviderManager _providerManager;
- protected IXmlReaderSettingsFactory XmlReaderSettingsFactory { get; private set; }
-
- public MusicVideoXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory)
- : base(fileSystem)
- {
- _logger = logger;
- _providerManager = providerManager;
- XmlReaderSettingsFactory = xmlReaderSettingsFactory;
- }
-
- protected override void Fetch(MetadataResult<MusicVideo> result, string path, CancellationToken cancellationToken)
- {
- new MusicVideoXmlParser(_logger, _providerManager, XmlReaderSettingsFactory, FileSystem).Fetch(result, path, cancellationToken);
- }
-
- protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)
- {
- return MovieXmlProvider.GetXmlFileInfo(info, FileSystem);
- }
- }
-}
diff --git a/MediaBrowser.LocalMetadata/Providers/SeriesXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/SeriesXmlProvider.cs
deleted file mode 100644
index 922005187..000000000
--- a/MediaBrowser.LocalMetadata/Providers/SeriesXmlProvider.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-using System.IO;
-using System.Threading;
-
-using MediaBrowser.Model.IO;
-using MediaBrowser.Controller.Entities.TV;
-using MediaBrowser.Controller.IO;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.LocalMetadata.Parsers;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.Xml;
-
-namespace MediaBrowser.LocalMetadata.Providers
-{
- /// <summary>
- /// Class SeriesProviderFromXml
- /// </summary>
- public class SeriesXmlProvider : BaseXmlProvider<Series>, IHasOrder
- {
- private readonly ILogger _logger;
- private readonly IProviderManager _providerManager;
- protected IXmlReaderSettingsFactory XmlReaderSettingsFactory { get; private set; }
-
- public SeriesXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory)
- : base(fileSystem)
- {
- _logger = logger;
- _providerManager = providerManager;
- XmlReaderSettingsFactory = xmlReaderSettingsFactory;
- }
-
- protected override void Fetch(MetadataResult<Series> result, string path, CancellationToken cancellationToken)
- {
- new SeriesXmlParser(_logger, _providerManager, XmlReaderSettingsFactory, FileSystem).Fetch(result, path, cancellationToken);
- }
-
- protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)
- {
- return directoryService.GetFile(Path.Combine(info.Path, "series.xml"));
- }
-
- public override int Order
- {
- get
- {
- // After Xbmc
- return 1;
- }
- }
- }
-}
diff --git a/MediaBrowser.LocalMetadata/Providers/VideoXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/VideoXmlProvider.cs
deleted file mode 100644
index 4212bf2c8..000000000
--- a/MediaBrowser.LocalMetadata/Providers/VideoXmlProvider.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Providers;
-using MediaBrowser.LocalMetadata.Parsers;
-using MediaBrowser.Model.Logging;
-using System.Threading;
-
-using MediaBrowser.Controller.IO;
-using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Xml;
-
-namespace MediaBrowser.LocalMetadata.Providers
-{
- class VideoXmlProvider : BaseXmlProvider<Video>
- {
- private readonly ILogger _logger;
- private readonly IProviderManager _providerManager;
- protected IXmlReaderSettingsFactory XmlReaderSettingsFactory { get; private set; }
-
- public VideoXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory)
- : base(fileSystem)
- {
- _logger = logger;
- _providerManager = providerManager;
- XmlReaderSettingsFactory = xmlReaderSettingsFactory;
- }
-
- protected override void Fetch(MetadataResult<Video> result, string path, CancellationToken cancellationToken)
- {
- new VideoXmlParser(_logger, _providerManager, XmlReaderSettingsFactory, FileSystem).Fetch(result, path, cancellationToken);
- }
-
- protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)
- {
- return MovieXmlProvider.GetXmlFileInfo(info, FileSystem);
- }
- }
-}
diff --git a/MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs b/MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs
index dab637a34..4eec33003 100644
--- a/MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs
+++ b/MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs
@@ -109,7 +109,6 @@ namespace MediaBrowser.LocalMetadata.Savers
"TvDbId",
"Type",
"TVRageId",
- "VoteCount",
"Website",
"Zap2ItId",
"CollectionItems",
@@ -407,10 +406,6 @@ namespace MediaBrowser.LocalMetadata.Savers
{
writer.WriteElementString("Rating", item.CommunityRating.Value.ToString(UsCulture));
}
- if (item.VoteCount.HasValue)
- {
- writer.WriteElementString("VoteCount", item.VoteCount.Value.ToString(UsCulture));
- }
if (item.ProductionYear.HasValue && !(item is Person))
{
diff --git a/MediaBrowser.LocalMetadata/project.json b/MediaBrowser.LocalMetadata/project.json
deleted file mode 100644
index fbbe9eaf3..000000000
--- a/MediaBrowser.LocalMetadata/project.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "frameworks":{
- "netstandard1.6":{
- "dependencies":{
- "NETStandard.Library":"1.6.0",
- }
- },
- ".NETPortable,Version=v4.5,Profile=Profile7":{
- "buildOptions": {
- "define": [ ]
- },
- "frameworkAssemblies":{
-
- }
- }
- }
-} \ No newline at end of file
diff --git a/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs b/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs
index 27f66835f..43e463902 100644
--- a/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs
@@ -90,7 +90,8 @@ namespace MediaBrowser.MediaEncoding.Encoder
"h264_qsv",
"hevc_qsv",
"mpeg2_qsv",
- "vc1_qsv"
+ "vc1_qsv",
+ "h264_cuvid"
};
foreach (var codec in required)
diff --git a/MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs b/MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs
index 97623c44b..d53701feb 100644
--- a/MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs
@@ -150,248 +150,6 @@ namespace MediaBrowser.MediaEncoding.Encoder
}
}
- public int? TotalOutputBitrate
- {
- get
- {
- return (OutputAudioBitrate ?? 0) + (OutputVideoBitrate ?? 0);
- }
- }
-
- public int? OutputWidth
- {
- get
- {
- if (VideoStream != null && VideoStream.Width.HasValue && VideoStream.Height.HasValue)
- {
- var size = new ImageSize
- {
- Width = VideoStream.Width.Value,
- Height = VideoStream.Height.Value
- };
-
- var newSize = DrawingUtils.Resize(size,
- Options.Width,
- Options.Height,
- Options.MaxWidth,
- Options.MaxHeight);
-
- return Convert.ToInt32(newSize.Width);
- }
-
- if (!IsVideoRequest)
- {
- return null;
- }
-
- return Options.MaxWidth ?? Options.Width;
- }
- }
-
- public int? OutputHeight
- {
- get
- {
- if (VideoStream != null && VideoStream.Width.HasValue && VideoStream.Height.HasValue)
- {
- var size = new ImageSize
- {
- Width = VideoStream.Width.Value,
- Height = VideoStream.Height.Value
- };
-
- var newSize = DrawingUtils.Resize(size,
- Options.Width,
- Options.Height,
- Options.MaxWidth,
- Options.MaxHeight);
-
- return Convert.ToInt32(newSize.Height);
- }
-
- if (!IsVideoRequest)
- {
- return null;
- }
-
- return Options.MaxHeight ?? Options.Height;
- }
- }
-
- /// <summary>
- /// Predicts the audio sample rate that will be in the output stream
- /// </summary>
- public int? TargetVideoBitDepth
- {
- get
- {
- var stream = VideoStream;
- return stream == null || !Options.Static ? null : stream.BitDepth;
- }
- }
-
- /// <summary>
- /// Gets the target reference frames.
- /// </summary>
- /// <value>The target reference frames.</value>
- public int? TargetRefFrames
- {
- get
- {
- var stream = VideoStream;
- return stream == null || !Options.Static ? null : stream.RefFrames;
- }
- }
-
- /// <summary>
- /// Predicts the audio sample rate that will be in the output stream
- /// </summary>
- public float? TargetFramerate
- {
- get
- {
- var stream = VideoStream;
- var requestedFramerate = Options.MaxFramerate ?? Options.Framerate;
-
- return requestedFramerate.HasValue && !Options.Static
- ? requestedFramerate
- : stream == null ? null : stream.AverageFrameRate ?? stream.RealFrameRate;
- }
- }
-
- public TransportStreamTimestamp TargetTimestamp
- {
- get
- {
- var defaultValue = string.Equals(OutputContainer, "m2ts", StringComparison.OrdinalIgnoreCase) ?
- TransportStreamTimestamp.Valid :
- TransportStreamTimestamp.None;
-
- return !Options.Static
- ? defaultValue
- : InputTimestamp;
- }
- }
-
- /// <summary>
- /// Predicts the audio sample rate that will be in the output stream
- /// </summary>
- public int? TargetPacketLength
- {
- get
- {
- var stream = VideoStream;
- return !Options.Static
- ? null
- : stream == null ? null : stream.PacketLength;
- }
- }
-
- /// <summary>
- /// Predicts the audio sample rate that will be in the output stream
- /// </summary>
- public string TargetVideoProfile
- {
- get
- {
- var stream = VideoStream;
- return !string.IsNullOrEmpty(Options.Profile) && !Options.Static
- ? Options.Profile
- : stream == null ? null : stream.Profile;
- }
- }
-
- public string TargetVideoCodecTag
- {
- get
- {
- var stream = VideoStream;
- return !Options.Static
- ? null
- : stream == null ? null : stream.CodecTag;
- }
- }
-
- public bool? IsTargetAnamorphic
- {
- get
- {
- if (Options.Static)
- {
- return VideoStream == null ? null : VideoStream.IsAnamorphic;
- }
-
- return false;
- }
- }
-
- public bool? IsTargetInterlaced
- {
- get
- {
- if (Options.Static)
- {
- return VideoStream == null ? (bool?)null : VideoStream.IsInterlaced;
- }
-
- if (DeInterlace)
- {
- return false;
- }
-
- return VideoStream == null ? (bool?)null : VideoStream.IsInterlaced;
- }
- }
-
- public bool? IsTargetAVC
- {
- get
- {
- if (Options.Static)
- {
- return VideoStream == null ? null : VideoStream.IsAVC;
- }
-
- return false;
- }
- }
-
- public int? TargetVideoStreamCount
- {
- get
- {
- if (Options.Static)
- {
- return GetMediaStreamCount(MediaStreamType.Video, int.MaxValue);
- }
- return GetMediaStreamCount(MediaStreamType.Video, 1);
- }
- }
-
- public int? TargetAudioStreamCount
- {
- get
- {
- if (Options.Static)
- {
- return GetMediaStreamCount(MediaStreamType.Audio, int.MaxValue);
- }
- return GetMediaStreamCount(MediaStreamType.Audio, 1);
- }
- }
-
- private int? GetMediaStreamCount(MediaStreamType type, int limit)
- {
- var count = MediaSource.GetStreamCount(type);
-
- if (count.HasValue)
- {
- count = Math.Min(count.Value, limit);
- }
-
- return count;
- }
-
public override void ReportTranscodingProgress(TimeSpan? transcodingPosition, float? framerate, double? percentComplete, long? bytesTranscoded, int? bitRate)
{
var ticks = transcodingPosition.HasValue ? transcodingPosition.Value.Ticks : (long?)null;
diff --git a/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs b/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs
index c74a8ce37..ba5f625f5 100644
--- a/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs
@@ -105,7 +105,6 @@ namespace MediaBrowser.MediaEncoding.Encoder
//state.OutputContainer = (container ?? string.Empty).TrimStart('.');
state.OutputAudioBitrate = encodingHelper.GetAudioBitrateParam(state.Options, state.AudioStream);
- state.OutputAudioSampleRate = request.AudioSampleRate;
state.OutputAudioCodec = state.Options.AudioCodec;
diff --git a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
index 280b01ee2..faf5b0667 100644
--- a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
@@ -80,11 +80,6 @@ namespace MediaBrowser.MediaEncoding.Encoder
int defaultImageExtractionTimeoutMs,
bool enableEncoderFontFile, IEnvironmentInfo environmentInfo)
{
- if (jsonSerializer == null)
- {
- throw new ArgumentNullException("jsonSerializer");
- }
-
_logger = logger;
_jsonSerializer = jsonSerializer;
ConfigurationManager = configurationManager;
@@ -330,7 +325,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
}
var newPaths = GetEncoderPaths(appPath);
- if (string.IsNullOrWhiteSpace(newPaths.Item1) || string.IsNullOrWhiteSpace(newPaths.Item2))
+ if (string.IsNullOrWhiteSpace(newPaths.Item1) || string.IsNullOrWhiteSpace(newPaths.Item2) || IsSystemInstalledPath(appPath))
{
newPaths = TestForInstalledVersions();
}
diff --git a/MediaBrowser.MediaEncoding/project.json b/MediaBrowser.MediaEncoding/project.json
deleted file mode 100644
index fbbe9eaf3..000000000
--- a/MediaBrowser.MediaEncoding/project.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "frameworks":{
- "netstandard1.6":{
- "dependencies":{
- "NETStandard.Library":"1.6.0",
- }
- },
- ".NETPortable,Version=v4.5,Profile=Profile7":{
- "buildOptions": {
- "define": [ ]
- },
- "frameworkAssemblies":{
-
- }
- }
- }
-} \ No newline at end of file
diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs
index e30364de9..4529de59a 100644
--- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs
+++ b/MediaBrowser.Model/Configuration/ServerConfiguration.cs
@@ -17,8 +17,6 @@ namespace MediaBrowser.Model.Configuration
/// <value><c>true</c> if [enable u pn p]; otherwise, <c>false</c>.</value>
public bool EnableUPnP { get; set; }
- public bool EnableSimpleSortNameHandling { get; set; }
-
/// <summary>
/// Gets or sets the public mapped port.
/// </summary>
diff --git a/MediaBrowser.Model/Dlna/CodecProfile.cs b/MediaBrowser.Model/Dlna/CodecProfile.cs
index 29d4d21ec..e04e04d21 100644
--- a/MediaBrowser.Model/Dlna/CodecProfile.cs
+++ b/MediaBrowser.Model/Dlna/CodecProfile.cs
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Xml.Serialization;
using MediaBrowser.Model.Dlna;
+using System.Linq;
namespace MediaBrowser.Model.Dlna
{
@@ -26,24 +27,24 @@ namespace MediaBrowser.Model.Dlna
ApplyConditions = new ProfileCondition[] { };
}
- public List<string> GetCodecs()
+ private static List<string> SplitValue(string value)
{
List<string> list = new List<string>();
- foreach (string i in (Codec ?? string.Empty).Split(','))
+ foreach (string i in (value ?? string.Empty).Split(','))
{
if (!string.IsNullOrEmpty(i)) list.Add(i);
}
return list;
}
+ public List<string> GetCodecs()
+ {
+ return SplitValue(Codec);
+ }
+
public List<string> GetContainers()
{
- List<string> list = new List<string>();
- foreach (string i in (Container ?? string.Empty).Split(','))
- {
- if (!string.IsNullOrEmpty(i)) list.Add(i);
- }
- return list;
+ return SplitValue(Container);
}
private bool ContainsContainer(string container)
@@ -62,7 +63,8 @@ namespace MediaBrowser.Model.Dlna
List<string> codecs = GetCodecs();
- return codecs.Count == 0 || ListHelper.ContainsIgnoreCase(codecs, codec);
+ return codecs.Count == 0 || ListHelper.ContainsIgnoreCase(codecs, SplitValue(codec)[0]);
+ //return codecs.Count == 0 || SplitValue(codec).Any(i => ListHelper.ContainsIgnoreCase(codecs, i));
}
}
}
diff --git a/MediaBrowser.Model/Dlna/StreamBuilder.cs b/MediaBrowser.Model/Dlna/StreamBuilder.cs
index 1e64c04d2..0ecc413f2 100644
--- a/MediaBrowser.Model/Dlna/StreamBuilder.cs
+++ b/MediaBrowser.Model/Dlna/StreamBuilder.cs
@@ -1180,11 +1180,11 @@ namespace MediaBrowser.Model.Dlna
bool isInterlaced;
if (bool.TryParse(value, out isInterlaced))
{
- if (isInterlaced && condition.Condition == ProfileConditionType.Equals)
+ if (!isInterlaced && condition.Condition == ProfileConditionType.Equals)
{
item.DeInterlace = true;
}
- else if (!isInterlaced && condition.Condition == ProfileConditionType.NotEquals)
+ else if (isInterlaced && condition.Condition == ProfileConditionType.NotEquals)
{
item.DeInterlace = true;
}
diff --git a/MediaBrowser.Model/Dto/BaseItemDto.cs b/MediaBrowser.Model/Dto/BaseItemDto.cs
index d44659705..8077a5211 100644
--- a/MediaBrowser.Model/Dto/BaseItemDto.cs
+++ b/MediaBrowser.Model/Dto/BaseItemDto.cs
@@ -64,7 +64,7 @@ namespace MediaBrowser.Model.Dto
public DateTime? DateCreated { get; set; }
public DateTime? DateLastMediaAdded { get; set; }
- public ExtraType? ExtraType { get; set; }
+ public string ExtraType { get; set; }
public int? AirsBeforeSeasonNumber { get; set; }
public int? AirsAfterSeasonNumber { get; set; }
@@ -222,12 +222,6 @@ namespace MediaBrowser.Model.Dto
public float? CommunityRating { get; set; }
/// <summary>
- /// Gets or sets the vote count.
- /// </summary>
- /// <value>The vote count.</value>
- public int? VoteCount { get; set; }
-
- /// <summary>
/// Gets or sets the cumulative run time ticks.
/// </summary>
/// <value>The cumulative run time ticks.</value>
diff --git a/MediaBrowser.Model/Entities/BaseItemInfo.cs b/MediaBrowser.Model/Entities/BaseItemInfo.cs
deleted file mode 100644
index db6c4b3fa..000000000
--- a/MediaBrowser.Model/Entities/BaseItemInfo.cs
+++ /dev/null
@@ -1,178 +0,0 @@
-using MediaBrowser.Model.Dto;
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using MediaBrowser.Model.Serialization;
-
-namespace MediaBrowser.Model.Entities
-{
- /// <summary>
- /// This is a stub class containing only basic information about an item
- /// </summary>
- [DebuggerDisplay("Name = {Name}, ID = {Id}, Type = {Type}")]
- public class BaseItemInfo
- {
- /// <summary>
- /// Gets or sets the name.
- /// </summary>
- /// <value>The name.</value>
- public string Name { get; set; }
-
- /// <summary>
- /// Gets or sets the id.
- /// </summary>
- /// <value>The id.</value>
- public string Id { get; set; }
-
- /// <summary>
- /// Gets or sets the type.
- /// </summary>
- /// <value>The type.</value>
- public string Type { get; set; }
-
- /// <summary>
- /// Gets or sets the type of the media.
- /// </summary>
- /// <value>The type of the media.</value>
- public string MediaType { get; set; }
-
- /// <summary>
- /// Gets or sets the run time ticks.
- /// </summary>
- /// <value>The run time ticks.</value>
- public long? RunTimeTicks { get; set; }
-
- /// <summary>
- /// Gets or sets the primary image tag.
- /// </summary>
- /// <value>The primary image tag.</value>
- public string PrimaryImageTag { get; set; }
-
- /// <summary>
- /// Gets or sets the primary image item identifier.
- /// </summary>
- /// <value>The primary image item identifier.</value>
- public string PrimaryImageItemId { get; set; }
-
- /// <summary>
- /// Gets or sets the logo image tag.
- /// </summary>
- /// <value>The logo image tag.</value>
- public string LogoImageTag { get; set; }
-
- /// <summary>
- /// Gets or sets the logo item identifier.
- /// </summary>
- /// <value>The logo item identifier.</value>
- public string LogoItemId { get; set; }
-
- /// <summary>
- /// Gets or sets the thumb image tag.
- /// </summary>
- /// <value>The thumb image tag.</value>
- public string ThumbImageTag { get; set; }
-
- /// <summary>
- /// Gets or sets the thumb item identifier.
- /// </summary>
- /// <value>The thumb item identifier.</value>
- public string ThumbItemId { get; set; }
-
- /// <summary>
- /// Gets or sets the thumb image tag.
- /// </summary>
- /// <value>The thumb image tag.</value>
- public string BackdropImageTag { get; set; }
-
- /// <summary>
- /// Gets or sets the thumb item identifier.
- /// </summary>
- /// <value>The thumb item identifier.</value>
- public string BackdropItemId { get; set; }
-
- /// <summary>
- /// Gets or sets the premiere date.
- /// </summary>
- /// <value>The premiere date.</value>
- public DateTime? PremiereDate { get; set; }
-
- /// <summary>
- /// Gets or sets the production year.
- /// </summary>
- /// <value>The production year.</value>
- public int? ProductionYear { get; set; }
-
- /// <summary>
- /// Gets or sets the index number.
- /// </summary>
- /// <value>The index number.</value>
- public int? IndexNumber { get; set; }
-
- /// <summary>
- /// Gets or sets the index number end.
- /// </summary>
- /// <value>The index number end.</value>
- public int? IndexNumberEnd { get; set; }
-
- /// <summary>
- /// Gets or sets the parent index number.
- /// </summary>
- /// <value>The parent index number.</value>
- public int? ParentIndexNumber { get; set; }
-
- /// <summary>
- /// Gets or sets the name of the series.
- /// </summary>
- /// <value>The name of the series.</value>
- public string SeriesName { get; set; }
-
- /// <summary>
- /// Gets or sets the album.
- /// </summary>
- /// <value>The album.</value>
- public string Album { get; set; }
-
- public bool IsThemeMedia { get; set; }
-
- /// <summary>
- /// Gets or sets the artists.
- /// </summary>
- /// <value>The artists.</value>
- public List<string> Artists { get; set; }
-
- /// <summary>
- /// Gets or sets the media streams.
- /// </summary>
- /// <value>The media streams.</value>
- public List<MediaStream> MediaStreams { get; set; }
-
- /// <summary>
- /// Gets or sets the chapter images item identifier.
- /// </summary>
- /// <value>The chapter images item identifier.</value>
- public string ChapterImagesItemId { get; set; }
-
- /// <summary>
- /// Gets or sets the chapters.
- /// </summary>
- /// <value>The chapters.</value>
- public List<ChapterInfoDto> Chapters { get; set; }
-
- /// <summary>
- /// Gets a value indicating whether this instance has primary image.
- /// </summary>
- /// <value><c>true</c> if this instance has primary image; otherwise, <c>false</c>.</value>
- [IgnoreDataMember]
- public bool HasPrimaryImage
- {
- get { return PrimaryImageTag != null; }
- }
-
- public BaseItemInfo()
- {
- Artists = new List<string>();
- MediaStreams = new List<MediaStream>();
- Chapters = new List<ChapterInfoDto>();
- }
- }
-}
diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj
index 67a04c5a1..e6cc58868 100644
--- a/MediaBrowser.Model/MediaBrowser.Model.csproj
+++ b/MediaBrowser.Model/MediaBrowser.Model.csproj
@@ -34,10 +34,6 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
- <None Include="project.json" />
- <!-- A reference to the entire .NET Framework is automatically included -->
- </ItemGroup>
- <ItemGroup>
<Compile Include="..\SharedVersion.cs">
<Link>Properties\SharedVersion.cs</Link>
</Compile>
@@ -326,7 +322,6 @@
<Compile Include="Querying\EpisodeQuery.cs" />
<Compile Include="Querying\ItemCountsQuery.cs" />
<Compile Include="Querying\ItemsByNameQuery.cs" />
- <Compile Include="Entities\BaseItemInfo.cs" />
<Compile Include="Querying\LatestItemsQuery.cs" />
<Compile Include="Querying\MovieRecommendationQuery.cs" />
<Compile Include="Querying\NextUpQuery.cs" />
diff --git a/MediaBrowser.Model/MediaInfo/PlaybackInfoRequest.cs b/MediaBrowser.Model/MediaInfo/PlaybackInfoRequest.cs
index 0518064c9..1843fb69a 100644
--- a/MediaBrowser.Model/MediaInfo/PlaybackInfoRequest.cs
+++ b/MediaBrowser.Model/MediaInfo/PlaybackInfoRequest.cs
@@ -30,6 +30,7 @@ namespace MediaBrowser.Model.MediaInfo
public bool ForceDirectPlayRemoteMediaSource { get; set; }
public bool AllowVideoStreamCopy { get; set; }
public bool AllowAudioStreamCopy { get; set; }
+ public bool AutoOpenLiveStream { get; set; }
public PlaybackInfoRequest()
{
diff --git a/MediaBrowser.Model/Querying/ItemFields.cs b/MediaBrowser.Model/Querying/ItemFields.cs
index 9a7052089..85d0a0baf 100644
--- a/MediaBrowser.Model/Querying/ItemFields.cs
+++ b/MediaBrowser.Model/Querying/ItemFields.cs
@@ -207,11 +207,6 @@
Tags,
/// <summary>
- /// The vote count
- /// </summary>
- VoteCount,
-
- /// <summary>
/// The trailer url of the item
/// </summary>
RemoteTrailers,
diff --git a/MediaBrowser.Model/Session/PlaybackProgressInfo.cs b/MediaBrowser.Model/Session/PlaybackProgressInfo.cs
index fff4ee8e0..5f81f7269 100644
--- a/MediaBrowser.Model/Session/PlaybackProgressInfo.cs
+++ b/MediaBrowser.Model/Session/PlaybackProgressInfo.cs
@@ -1,4 +1,4 @@
-using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Dto;
namespace MediaBrowser.Model.Session
{
@@ -17,7 +17,7 @@ namespace MediaBrowser.Model.Session
/// Gets or sets the item.
/// </summary>
/// <value>The item.</value>
- public BaseItemInfo Item { get; set; }
+ public BaseItemDto Item { get; set; }
/// <summary>
/// Gets or sets the item identifier.
@@ -67,6 +67,8 @@ namespace MediaBrowser.Model.Session
/// <value>The position ticks.</value>
public long? PositionTicks { get; set; }
+ public long? playbackStartTimeTicks { get; set; }
+
/// <summary>
/// Gets or sets the volume level.
/// </summary>
diff --git a/MediaBrowser.Model/Session/PlaybackStopInfo.cs b/MediaBrowser.Model/Session/PlaybackStopInfo.cs
index 74347f894..160ef3554 100644
--- a/MediaBrowser.Model/Session/PlaybackStopInfo.cs
+++ b/MediaBrowser.Model/Session/PlaybackStopInfo.cs
@@ -1,4 +1,4 @@
-using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Dto;
namespace MediaBrowser.Model.Session
{
@@ -11,7 +11,7 @@ namespace MediaBrowser.Model.Session
/// Gets or sets the item.
/// </summary>
/// <value>The item.</value>
- public BaseItemInfo Item { get; set; }
+ public BaseItemDto Item { get; set; }
/// <summary>
/// Gets or sets the item identifier.
/// </summary>
diff --git a/MediaBrowser.Model/Session/SessionInfoDto.cs b/MediaBrowser.Model/Session/SessionInfoDto.cs
index 0909d255a..b21a089aa 100644
--- a/MediaBrowser.Model/Session/SessionInfoDto.cs
+++ b/MediaBrowser.Model/Session/SessionInfoDto.cs
@@ -1,4 +1,4 @@
-using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Dto;
using System;
using System.Collections.Generic;
using System.Diagnostics;
@@ -72,7 +72,7 @@ namespace MediaBrowser.Model.Session
/// Gets or sets the now viewing item.
/// </summary>
/// <value>The now viewing item.</value>
- public BaseItemInfo NowViewingItem { get; set; }
+ public BaseItemDto NowViewingItem { get; set; }
/// <summary>
/// Gets or sets the name of the device.
@@ -84,7 +84,7 @@ namespace MediaBrowser.Model.Session
/// Gets or sets the now playing item.
/// </summary>
/// <value>The now playing item.</value>
- public BaseItemInfo NowPlayingItem { get; set; }
+ public BaseItemDto NowPlayingItem { get; set; }
/// <summary>
/// Gets or sets the device id.
diff --git a/MediaBrowser.Model/project.json b/MediaBrowser.Model/project.json
deleted file mode 100644
index fbbe9eaf3..000000000
--- a/MediaBrowser.Model/project.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "frameworks":{
- "netstandard1.6":{
- "dependencies":{
- "NETStandard.Library":"1.6.0",
- }
- },
- ".NETPortable,Version=v4.5,Profile=Profile7":{
- "buildOptions": {
- "define": [ ]
- },
- "frameworkAssemblies":{
-
- }
- }
- }
-} \ No newline at end of file
diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs
index 16dfd8945..3cdda2cbb 100644
--- a/MediaBrowser.Providers/Manager/ProviderManager.cs
+++ b/MediaBrowser.Providers/Manager/ProviderManager.cs
@@ -13,17 +13,13 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Providers;
using System;
-using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Model.IO;
-
using MediaBrowser.Controller.Dto;
-using MediaBrowser.Controller.IO;
-using MediaBrowser.Model.IO;
using MediaBrowser.Model.Serialization;
using Priority_Queue;
@@ -69,6 +65,7 @@ namespace MediaBrowser.Providers.Manager
private readonly Func<ILibraryManager> _libraryManagerFactory;
private readonly IMemoryStreamFactory _memoryStreamProvider;
+ private CancellationTokenSource _disposeCancellationTokenSource = new CancellationTokenSource();
/// <summary>
/// Initializes a new instance of the <see cref="ProviderManager" /> class.
@@ -882,6 +879,13 @@ namespace MediaBrowser.Providers.Manager
Tuple<Guid, MetadataRefreshOptions> refreshItem;
var libraryManager = _libraryManagerFactory();
+ if (_disposed)
+ {
+ return;
+ }
+
+ var cancellationToken = _disposeCancellationTokenSource.Token;
+
while (_refreshQueue.TryDequeue(out refreshItem))
{
if (_disposed)
@@ -902,18 +906,22 @@ namespace MediaBrowser.Providers.Manager
var folder = item as Folder;
if (folder != null)
{
- await folder.ValidateChildren(new Progress<double>(), CancellationToken.None).ConfigureAwait(false);
+ await folder.ValidateChildren(new Progress<double>(), cancellationToken).ConfigureAwait(false);
}
}
var artist = item as MusicArtist;
var task = artist == null
- ? RefreshItem(item, refreshItem.Item2, CancellationToken.None)
- : RefreshArtist(artist, refreshItem.Item2);
+ ? RefreshItem(item, refreshItem.Item2, cancellationToken)
+ : RefreshArtist(artist, refreshItem.Item2, cancellationToken);
await task.ConfigureAwait(false);
}
}
+ catch (OperationCanceledException)
+ {
+ break;
+ }
catch (Exception ex)
{
_logger.ErrorException("Error refreshing item", ex);
@@ -928,14 +936,14 @@ namespace MediaBrowser.Providers.Manager
private async Task RefreshItem(BaseItem item, MetadataRefreshOptions options, CancellationToken cancellationToken)
{
- await item.RefreshMetadata(options, CancellationToken.None).ConfigureAwait(false);
+ await item.RefreshMetadata(options, cancellationToken).ConfigureAwait(false);
// Collection folders don't validate their children so we'll have to simulate that here
var collectionFolder = item as CollectionFolder;
if (collectionFolder != null)
{
- await RefreshCollectionFolderChildren(options, collectionFolder).ConfigureAwait(false);
+ await RefreshCollectionFolderChildren(options, collectionFolder, cancellationToken).ConfigureAwait(false);
}
else
{
@@ -948,25 +956,23 @@ namespace MediaBrowser.Providers.Manager
}
}
- private async Task RefreshCollectionFolderChildren(MetadataRefreshOptions options, CollectionFolder collectionFolder)
+ private async Task RefreshCollectionFolderChildren(MetadataRefreshOptions options, CollectionFolder collectionFolder, CancellationToken cancellationToken)
{
foreach (var child in collectionFolder.Children.ToList())
{
- await child.RefreshMetadata(options, CancellationToken.None).ConfigureAwait(false);
+ await child.RefreshMetadata(options, cancellationToken).ConfigureAwait(false);
if (child.IsFolder)
{
var folder = (Folder)child;
- await folder.ValidateChildren(new Progress<double>(), CancellationToken.None, options, true).ConfigureAwait(false);
+ await folder.ValidateChildren(new Progress<double>(), cancellationToken, options, true).ConfigureAwait(false);
}
}
}
- private async Task RefreshArtist(MusicArtist item, MetadataRefreshOptions options)
+ private async Task RefreshArtist(MusicArtist item, MetadataRefreshOptions options, CancellationToken cancellationToken)
{
- var cancellationToken = CancellationToken.None;
-
var albums = _libraryManagerFactory()
.GetItemList(new InternalItemsQuery
{
@@ -991,7 +997,7 @@ namespace MediaBrowser.Providers.Manager
try
{
- await item.RefreshMetadata(options, CancellationToken.None).ConfigureAwait(false);
+ await item.RefreshMetadata(options, cancellationToken).ConfigureAwait(false);
}
catch (Exception ex)
{
@@ -1009,6 +1015,11 @@ namespace MediaBrowser.Providers.Manager
public void Dispose()
{
_disposed = true;
+
+ if (!_disposeCancellationTokenSource.IsCancellationRequested)
+ {
+ _disposeCancellationTokenSource.Cancel();
+ }
}
}
} \ No newline at end of file
diff --git a/MediaBrowser.Providers/Manager/ProviderUtils.cs b/MediaBrowser.Providers/Manager/ProviderUtils.cs
index 1e107d0be..042b7241b 100644
--- a/MediaBrowser.Providers/Manager/ProviderUtils.cs
+++ b/MediaBrowser.Providers/Manager/ProviderUtils.cs
@@ -180,11 +180,6 @@ namespace MediaBrowser.Providers.Manager
}
}
- if (replaceData || !target.VoteCount.HasValue)
- {
- target.VoteCount = source.VoteCount;
- }
-
foreach (var id in source.ProviderIds)
{
var key = id.Key;
@@ -200,6 +195,32 @@ namespace MediaBrowser.Providers.Manager
MergeCriticRating(source, target, lockedFields, replaceData);
MergeTrailers(source, target, lockedFields, replaceData);
MergeVideoInfo(source, target, lockedFields, replaceData);
+ MergeDisplayOrder(source, target, lockedFields, replaceData);
+
+ //if (!lockedFields.Contains(MetadataFields.SortName))
+ {
+ if (replaceData || string.IsNullOrEmpty(target.ForcedSortName))
+ {
+ var forcedSortName = source.ForcedSortName;
+
+ if (!string.IsNullOrWhiteSpace(forcedSortName))
+ {
+ target.ForcedSortName = forcedSortName;
+ }
+ }
+ }
+
+ //if (!lockedFields.Contains(MetadataFields.DisplayMediaType))
+ {
+ if (replaceData || string.IsNullOrEmpty(target.DisplayMediaType))
+ {
+ // Safeguard against incoming data having an emtpy name
+ if (!string.IsNullOrWhiteSpace(source.DisplayMediaType))
+ {
+ target.DisplayMediaType = source.DisplayMediaType;
+ }
+ }
+ }
if (mergeMetadataSettings)
{
@@ -235,10 +256,8 @@ namespace MediaBrowser.Providers.Manager
public static void MergeMetadataSettings(BaseItem source,
BaseItem target)
{
- target.ForcedSortName = source.ForcedSortName;
target.LockedFields = source.LockedFields;
target.IsLocked = source.IsLocked;
- target.DisplayMediaType = source.DisplayMediaType;
// Grab the value if it's there, but if not then don't overwrite the default
if (source.DateCreated != default(DateTime))
@@ -248,7 +267,10 @@ namespace MediaBrowser.Providers.Manager
target.PreferredMetadataCountryCode = source.PreferredMetadataCountryCode;
target.PreferredMetadataLanguage = source.PreferredMetadataLanguage;
+ }
+ private static void MergeDisplayOrder(BaseItem source, BaseItem target, List<MetadataFields> lockedFields, bool replaceData)
+ {
var sourceHasDisplayOrder = source as IHasDisplayOrder;
var targetHasDisplayOrder = target as IHasDisplayOrder;
diff --git a/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs b/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs
index ba24bd600..c3aa87a22 100644
--- a/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs
+++ b/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs
@@ -62,13 +62,6 @@ namespace MediaBrowser.Providers.Movies
public bool Supports(IHasImages item)
{
- // Supports images for tv movies
- var tvProgram = item as LiveTvProgram;
- if (tvProgram != null && tvProgram.IsMovie)
- {
- return true;
- }
-
return item is Movie || item is BoxSet || item is MusicVideo;
}
diff --git a/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs b/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs
index 6a1af9272..b40e4a120 100644
--- a/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs
+++ b/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs
@@ -173,7 +173,7 @@ namespace MediaBrowser.Providers.Movies
movie.CommunityRating = rating;
}
- movie.VoteCount = movieData.vote_count;
+ //movie.VoteCount = movieData.vote_count;
//release date and certification are retrieved based on configured country and we fall back on US if not there and to minimun release date if still no match
if (movieData.releases != null && movieData.releases.countries != null)
diff --git a/MediaBrowser.Providers/Omdb/OmdbImageProvider.cs b/MediaBrowser.Providers/Omdb/OmdbImageProvider.cs
index 98a746053..04d218472 100644
--- a/MediaBrowser.Providers/Omdb/OmdbImageProvider.cs
+++ b/MediaBrowser.Providers/Omdb/OmdbImageProvider.cs
@@ -54,11 +54,23 @@ namespace MediaBrowser.Providers.Omdb
if (!string.IsNullOrEmpty(rootObject.Poster))
{
- list.Add(new RemoteImageInfo
+ if (item is Episode)
{
- ProviderName = Name,
- Url = string.Format("https://img.omdbapi.com/?i={0}&apikey=82e83907", imdbId)
- });
+ // img.omdbapi.com returning 404's
+ list.Add(new RemoteImageInfo
+ {
+ ProviderName = Name,
+ Url = rootObject.Poster
+ });
+ }
+ else
+ {
+ list.Add(new RemoteImageInfo
+ {
+ ProviderName = Name,
+ Url = string.Format("https://img.omdbapi.com/?i={0}&apikey=82e83907", imdbId)
+ });
+ }
}
}
diff --git a/MediaBrowser.Providers/Omdb/OmdbProvider.cs b/MediaBrowser.Providers/Omdb/OmdbProvider.cs
index 41ff71070..0a95b449c 100644
--- a/MediaBrowser.Providers/Omdb/OmdbProvider.cs
+++ b/MediaBrowser.Providers/Omdb/OmdbProvider.cs
@@ -78,7 +78,7 @@ namespace MediaBrowser.Providers.Omdb
&& int.TryParse(result.imdbVotes, NumberStyles.Number, _usCulture, out voteCount)
&& voteCount >= 0)
{
- item.VoteCount = voteCount;
+ //item.VoteCount = voteCount;
}
float imdbRating;
@@ -185,7 +185,7 @@ namespace MediaBrowser.Providers.Omdb
&& int.TryParse(result.imdbVotes, NumberStyles.Number, _usCulture, out voteCount)
&& voteCount >= 0)
{
- item.VoteCount = voteCount;
+ //item.VoteCount = voteCount;
}
float imdbRating;
diff --git a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbEpisodeProvider.cs b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbEpisodeProvider.cs
index 1938f7ff0..2e549f610 100644
--- a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbEpisodeProvider.cs
+++ b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbEpisodeProvider.cs
@@ -122,7 +122,7 @@ namespace MediaBrowser.Providers.TV
item.Overview = response.overview;
item.CommunityRating = (float)response.vote_average;
- item.VoteCount = response.vote_count;
+ //item.VoteCount = response.vote_count;
if (response.videos != null && response.videos.results != null)
{
diff --git a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeriesProvider.cs b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeriesProvider.cs
index fe3d7d78c..0b5708b56 100644
--- a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeriesProvider.cs
+++ b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeriesProvider.cs
@@ -217,7 +217,7 @@ namespace MediaBrowser.Providers.TV
series.Name = seriesInfo.name;
series.SetProviderId(MetadataProviders.Tmdb, seriesInfo.id.ToString(_usCulture));
- series.VoteCount = seriesInfo.vote_count;
+ //series.VoteCount = seriesInfo.vote_count;
string voteAvg = seriesInfo.vote_average.ToString(CultureInfo.InvariantCulture);
float rating;
diff --git a/MediaBrowser.Providers/TV/TheTVDB/TvdbEpisodeProvider.cs b/MediaBrowser.Providers/TV/TheTVDB/TvdbEpisodeProvider.cs
index 686bacfe1..d823de786 100644
--- a/MediaBrowser.Providers/TV/TheTVDB/TvdbEpisodeProvider.cs
+++ b/MediaBrowser.Providers/TV/TheTVDB/TvdbEpisodeProvider.cs
@@ -680,7 +680,7 @@ namespace MediaBrowser.Providers.TV
// int.TryParse is local aware, so it can be probamatic, force us culture
if (int.TryParse(val, NumberStyles.Integer, _usCulture, out rval))
{
- item.VoteCount = rval;
+ //item.VoteCount = rval;
}
}
diff --git a/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesProvider.cs b/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesProvider.cs
index 4c5e57a94..8a10affb9 100644
--- a/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesProvider.cs
+++ b/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesProvider.cs
@@ -1150,7 +1150,7 @@ namespace MediaBrowser.Providers.TV
// int.TryParse is local aware, so it can be probamatic, force us culture
if (int.TryParse(val, NumberStyles.Integer, _usCulture, out rval))
{
- item.VoteCount = rval;
+ //item.VoteCount = rval;
}
}
diff --git a/MediaBrowser.Providers/project.json b/MediaBrowser.Providers/project.json
deleted file mode 100644
index fbbe9eaf3..000000000
--- a/MediaBrowser.Providers/project.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "frameworks":{
- "netstandard1.6":{
- "dependencies":{
- "NETStandard.Library":"1.6.0",
- }
- },
- ".NETPortable,Version=v4.5,Profile=Profile7":{
- "buildOptions": {
- "define": [ ]
- },
- "frameworkAssemblies":{
-
- }
- }
- }
-} \ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/project.json b/MediaBrowser.Server.Implementations/project.json
deleted file mode 100644
index fbbe9eaf3..000000000
--- a/MediaBrowser.Server.Implementations/project.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "frameworks":{
- "netstandard1.6":{
- "dependencies":{
- "NETStandard.Library":"1.6.0",
- }
- },
- ".NETPortable,Version=v4.5,Profile=Profile7":{
- "buildOptions": {
- "define": [ ]
- },
- "frameworkAssemblies":{
-
- }
- }
- }
-} \ No newline at end of file
diff --git a/MediaBrowser.Server.Mono/ImageEncoderHelper.cs b/MediaBrowser.Server.Mono/ImageEncoderHelper.cs
index 2f7f2a45c..92eaf418b 100644
--- a/MediaBrowser.Server.Mono/ImageEncoderHelper.cs
+++ b/MediaBrowser.Server.Mono/ImageEncoderHelper.cs
@@ -8,6 +8,7 @@ using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
+using Emby.Drawing.Skia;
namespace MediaBrowser.Server.Startup.Common
{
@@ -24,6 +25,15 @@ namespace MediaBrowser.Server.Startup.Common
{
try
{
+ return new SkiaEncoder(logManager.GetLogger("Skia"), appPaths, httpClient, fileSystem);
+ }
+ catch
+ {
+ logger.Error("Error loading Skia. Will revert to ImageMagick.");
+ }
+
+ try
+ {
return new ImageMagickEncoder(logManager.GetLogger("ImageMagick"), appPaths, httpClient, fileSystem);
}
catch
diff --git a/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj b/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj
index 8199cf2c4..872330e9f 100644
--- a/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj
+++ b/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj
@@ -50,7 +50,7 @@
<HintPath>..\packages\Mono.Posix.4.0.0.0\lib\net40\Mono.Posix.dll</HintPath>
</Reference>
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
- <HintPath>..\packages\NLog.4.4.9\lib\net45\NLog.dll</HintPath>
+ <HintPath>..\packages\NLog.4.4.10\lib\net45\NLog.dll</HintPath>
</Reference>
<Reference Include="ServiceStack.Text, Version=4.5.8.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\ServiceStack.Text.4.5.8\lib\net45\ServiceStack.Text.dll</HintPath>
@@ -60,9 +60,8 @@
<HintPath>..\packages\SharpCompress.0.14.0\lib\net45\SharpCompress.dll</HintPath>
<Private>True</Private>
</Reference>
- <Reference Include="SimpleInjector, Version=4.0.7.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
- <HintPath>..\packages\SimpleInjector.4.0.7\lib\net45\SimpleInjector.dll</HintPath>
- <Private>True</Private>
+ <Reference Include="SimpleInjector, Version=4.0.8.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
+ <HintPath>..\packages\SimpleInjector.4.0.8\lib\net45\SimpleInjector.dll</HintPath>
</Reference>
<Reference Include="SQLitePCLRaw.core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1488e028ca7ab535, processorArchitecture=MSIL">
<HintPath>..\packages\SQLitePCLRaw.core.1.1.5\lib\net45\SQLitePCLRaw.core.dll</HintPath>
@@ -115,6 +114,10 @@
<Project>{6cfee013-6e7c-432b-ac37-cabf0880c69a}</Project>
<Name>Emby.Drawing.ImageMagick</Name>
</ProjectReference>
+ <ProjectReference Include="..\Emby.Drawing.Skia\Emby.Drawing.Skia.csproj">
+ <Project>{2312da6d-ff86-4597-9777-bceec32d96dd}</Project>
+ <Name>Emby.Drawing.Skia</Name>
+ </ProjectReference>
<ProjectReference Include="..\Emby.Drawing\Emby.Drawing.csproj">
<Project>{08fff49b-f175-4807-a2b5-73b0ebd9f716}</Project>
<Name>Emby.Drawing</Name>
@@ -198,6 +201,9 @@
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="packages.config" />
+ <None Include="SkiaSharp.dll.config">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
<None Include="SQLitePCLRaw.provider.sqlite3.dll.config">
<SubType>Designer</SubType>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
diff --git a/MediaBrowser.Server.Mono/Properties/AssemblyInfo.cs b/MediaBrowser.Server.Mono/Properties/AssemblyInfo.cs
index d4856bd01..eda3bcf97 100644
--- a/MediaBrowser.Server.Mono/Properties/AssemblyInfo.cs
+++ b/MediaBrowser.Server.Mono/Properties/AssemblyInfo.cs
@@ -7,7 +7,7 @@ using System.Reflection;
[assembly: AssemblyConfiguration ("")]
[assembly: AssemblyCompany ("")]
[assembly: AssemblyProduct ("")]
-[assembly: AssemblyCopyright ("Luke")]
+[assembly: AssemblyCopyright ("Emby")]
[assembly: AssemblyTrademark ("")]
[assembly: AssemblyCulture ("")]
// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
diff --git a/MediaBrowser.Server.Mono/SkiaSharp.dll.config b/MediaBrowser.Server.Mono/SkiaSharp.dll.config
new file mode 100644
index 000000000..fe0650f64
--- /dev/null
+++ b/MediaBrowser.Server.Mono/SkiaSharp.dll.config
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+ <dllmap dll="libSkiaSharp.dll" target="libSkiaSharp.dylib" os="osx" />
+ <dllmap dll="libSkiaSharp.dll" target="libSkiaSharp.so" os="!windows,osx" />
+</configuration> \ No newline at end of file
diff --git a/MediaBrowser.Server.Mono/packages.config b/MediaBrowser.Server.Mono/packages.config
index 0e846ac8f..85f3d58b0 100644
--- a/MediaBrowser.Server.Mono/packages.config
+++ b/MediaBrowser.Server.Mono/packages.config
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Mono.Posix" version="4.0.0.0" targetFramework="net45" />
- <package id="NLog" version="4.4.9" targetFramework="net46" />
+ <package id="NLog" version="4.4.10" targetFramework="net46" />
<package id="ServiceStack.Text" version="4.5.8" targetFramework="net46" />
<package id="SharpCompress" version="0.14.0" targetFramework="net46" />
- <package id="SimpleInjector" version="4.0.7" targetFramework="net46" />
+ <package id="SimpleInjector" version="4.0.8" targetFramework="net46" />
<package id="SQLitePCLRaw.core" version="1.1.5" targetFramework="net46" />
<package id="SQLitePCLRaw.provider.sqlite3.net45" version="1.1.5" targetFramework="net46" />
</packages> \ No newline at end of file
diff --git a/MediaBrowser.ServerApplication/ImageEncoderHelper.cs b/MediaBrowser.ServerApplication/ImageEncoderHelper.cs
index a6651ea40..56729e74c 100644
--- a/MediaBrowser.ServerApplication/ImageEncoderHelper.cs
+++ b/MediaBrowser.ServerApplication/ImageEncoderHelper.cs
@@ -30,15 +30,6 @@ namespace MediaBrowser.Server.Startup.Common
logger.Error("Error loading Skia. Will revert to ImageMagick.");
}
- try
- {
- return new ImageMagickEncoder(logManager.GetLogger("ImageMagick"), appPaths, httpClient, fileSystem);
- }
- catch
- {
- logger.Error("Error loading ImageMagick. Will revert to GDI.");
- }
-
return new NullImageEncoder();
}
}
diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
index 637474380..4cc3fd6a5 100644
--- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
+++ b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
@@ -78,7 +78,7 @@
<HintPath>..\packages\ImageMagickSharp.1.0.0.18\lib\net45\ImageMagickSharp.dll</HintPath>
</Reference>
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
- <HintPath>..\packages\NLog.4.4.9\lib\net45\NLog.dll</HintPath>
+ <HintPath>..\packages\NLog.4.4.10\lib\net45\NLog.dll</HintPath>
</Reference>
<Reference Include="ServiceStack.Text, Version=4.5.8.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\ServiceStack.Text.4.5.8\lib\net45\ServiceStack.Text.dll</HintPath>
@@ -88,9 +88,8 @@
<HintPath>..\packages\SharpCompress.0.14.0\lib\net45\SharpCompress.dll</HintPath>
<Private>True</Private>
</Reference>
- <Reference Include="SimpleInjector, Version=4.0.7.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
- <HintPath>..\packages\SimpleInjector.4.0.7\lib\net45\SimpleInjector.dll</HintPath>
- <Private>True</Private>
+ <Reference Include="SimpleInjector, Version=4.0.8.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
+ <HintPath>..\packages\SimpleInjector.4.0.8\lib\net45\SimpleInjector.dll</HintPath>
</Reference>
<Reference Include="SkiaSharp, Version=1.58.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
<HintPath>..\packages\SkiaSharp.1.58.0\lib\net45\SkiaSharp.dll</HintPath>
@@ -632,6 +631,8 @@
<Content Include="x64\sqlite3.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
+ <Content Include="Icon.ico" />
+ <Content Include="Resources\Images\mb3logo800.png" />
<Content Include="x86\CORE_RL_bzlib_.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -695,7 +696,6 @@
<Content Include="x86\CORE_RL_zlib_.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="Icon.ico" />
<Content Include="x86\IM_MOD_RL_aai_.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -1071,7 +1071,6 @@
<Content Include="x86\IM_MOD_RL_yuv_.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
- <Content Include="Resources\Images\mb3logo800.png" />
<Content Include="x86\libSkiaSharp.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
diff --git a/MediaBrowser.ServerApplication/packages.config b/MediaBrowser.ServerApplication/packages.config
index 4d4bde09f..9abd370f3 100644
--- a/MediaBrowser.ServerApplication/packages.config
+++ b/MediaBrowser.ServerApplication/packages.config
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="ImageMagickSharp" version="1.0.0.18" targetFramework="net45" />
- <package id="NLog" version="4.4.9" targetFramework="net462" />
+ <package id="NLog" version="4.4.10" targetFramework="net462" />
<package id="ServiceStack.Text" version="4.5.8" targetFramework="net462" />
<package id="SharpCompress" version="0.14.0" targetFramework="net462" />
- <package id="SimpleInjector" version="4.0.7" targetFramework="net462" />
+ <package id="SimpleInjector" version="4.0.8" targetFramework="net462" />
<package id="SkiaSharp" version="1.58.0" targetFramework="net462" />
<package id="SQLitePCLRaw.core" version="1.1.5" targetFramework="net462" />
<package id="SQLitePCLRaw.provider.sqlite3.net45" version="1.1.5" targetFramework="net462" />
diff --git a/MediaBrowser.WebDashboard/project.json b/MediaBrowser.WebDashboard/project.json
deleted file mode 100644
index fbbe9eaf3..000000000
--- a/MediaBrowser.WebDashboard/project.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "frameworks":{
- "netstandard1.6":{
- "dependencies":{
- "NETStandard.Library":"1.6.0",
- }
- },
- ".NETPortable,Version=v4.5,Profile=Profile7":{
- "buildOptions": {
- "define": [ ]
- },
- "frameworkAssemblies":{
-
- }
- }
- }
-} \ No newline at end of file
diff --git a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs
index c9ec195d9..d424cc0ca 100644
--- a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs
+++ b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs
@@ -704,21 +704,6 @@ namespace MediaBrowser.XbmcMetadata.Parsers
break;
}
- case "votes":
- {
- var val = reader.ReadElementContentAsString();
- if (!string.IsNullOrWhiteSpace(val))
- {
- int num;
-
- if (int.TryParse(val, NumberStyles.Integer, _usCulture, out num))
- {
- item.VoteCount = num;
- }
- }
- break;
- }
-
case "genre":
{
var val = reader.ReadElementContentAsString();
diff --git a/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs
index a5955e14d..cf7c25584 100644
--- a/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs
+++ b/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs
@@ -63,7 +63,6 @@ namespace MediaBrowser.XbmcMetadata.Savers
"releasedate",
"outline",
"id",
- "votes",
"credits",
"originaltitle",
"watched",
@@ -659,11 +658,6 @@ namespace MediaBrowser.XbmcMetadata.Savers
}
}
- if (item.VoteCount.HasValue)
- {
- writer.WriteElementString("votes", item.VoteCount.Value.ToString(UsCulture));
- }
-
// Use original runtime here, actual file runtime later in MediaInfo
var runTimeTicks = item.RunTimeTicks;
diff --git a/MediaBrowser.XbmcMetadata/project.json b/MediaBrowser.XbmcMetadata/project.json
deleted file mode 100644
index fbbe9eaf3..000000000
--- a/MediaBrowser.XbmcMetadata/project.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "frameworks":{
- "netstandard1.6":{
- "dependencies":{
- "NETStandard.Library":"1.6.0",
- }
- },
- ".NETPortable,Version=v4.5,Profile=Profile7":{
- "buildOptions": {
- "define": [ ]
- },
- "frameworkAssemblies":{
-
- }
- }
- }
-} \ No newline at end of file
diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec
index 23fbb9bc3..90663b500 100644
--- a/Nuget/MediaBrowser.Common.nuspec
+++ b/Nuget/MediaBrowser.Common.nuspec
@@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>MediaBrowser.Common</id>
- <version>3.0.701</version>
+ <version>3.0.703</version>
<title>Emby.Common</title>
<authors>Emby Team</authors>
<owners>ebr,Luke,scottisafool</owners>
diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec
index 8f59afce3..e5cb120d3 100644
--- a/Nuget/MediaBrowser.Server.Core.nuspec
+++ b/Nuget/MediaBrowser.Server.Core.nuspec
@@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>MediaBrowser.Server.Core</id>
- <version>3.0.701</version>
+ <version>3.0.703</version>
<title>Emby.Server.Core</title>
<authors>Emby Team</authors>
<owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
<description>Contains core components required to build plugins for Emby Server.</description>
<copyright>Copyright © Emby 2013</copyright>
<dependencies>
- <dependency id="MediaBrowser.Common" version="3.0.701" />
+ <dependency id="MediaBrowser.Common" version="3.0.703" />
</dependencies>
</metadata>
<files>
diff --git a/OpenSubtitlesHandler/OpenSubtitlesHandler.csproj b/OpenSubtitlesHandler/OpenSubtitlesHandler.csproj
index e54683027..d70f72962 100644
--- a/OpenSubtitlesHandler/OpenSubtitlesHandler.csproj
+++ b/OpenSubtitlesHandler/OpenSubtitlesHandler.csproj
@@ -107,9 +107,6 @@
<ItemGroup>
<Content Include="XML-RPC\Docs\XML-RPC.txt" />
</ItemGroup>
- <ItemGroup>
- <None Include="project.json" />
- </ItemGroup>
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
diff --git a/OpenSubtitlesHandler/project.json b/OpenSubtitlesHandler/project.json
deleted file mode 100644
index fbbe9eaf3..000000000
--- a/OpenSubtitlesHandler/project.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "frameworks":{
- "netstandard1.6":{
- "dependencies":{
- "NETStandard.Library":"1.6.0",
- }
- },
- ".NETPortable,Version=v4.5,Profile=Profile7":{
- "buildOptions": {
- "define": [ ]
- },
- "frameworkAssemblies":{
-
- }
- }
- }
-} \ No newline at end of file
diff --git a/RSSDP/project.json b/RSSDP/project.json
deleted file mode 100644
index fbbe9eaf3..000000000
--- a/RSSDP/project.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "frameworks":{
- "netstandard1.6":{
- "dependencies":{
- "NETStandard.Library":"1.6.0",
- }
- },
- ".NETPortable,Version=v4.5,Profile=Profile7":{
- "buildOptions": {
- "define": [ ]
- },
- "frameworkAssemblies":{
-
- }
- }
- }
-} \ No newline at end of file