make open subtitle project portable

This commit is contained in:
Luke Pulverenti 2016-10-27 18:54:56 -04:00
parent 0d5e95222a
commit 31c8c3bf7f
16 changed files with 9229 additions and 86 deletions

View File

@ -32,6 +32,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Common.Impleme
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Providers", "MediaBrowser.Providers\MediaBrowser.Providers.csproj", "{442B5058-DCAF-4263-BB6A-F21E31120A1B}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Providers", "MediaBrowser.Providers\MediaBrowser.Providers.csproj", "{442B5058-DCAF-4263-BB6A-F21E31120A1B}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSubtitlesHandler", "OpenSubtitlesHandler\OpenSubtitlesHandler.csproj", "{4A4402D4-E910-443B-B8FC-2C18286A2CA0}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@ -105,6 +107,12 @@ Global
{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|Any CPU.ActiveCfg = Release|Any CPU {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|Any CPU.Build.0 = Release|Any CPU {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|Any CPU.Build.0 = Release|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@ -121,5 +129,6 @@ Global
{88AE38DF-19D7-406F-A6A9-09527719A21E} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839} {88AE38DF-19D7-406F-A6A9-09527719A21E} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
{C4D2573A-3FD3-441F-81AF-174AC4CD4E1D} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839} {C4D2573A-3FD3-441F-81AF-174AC4CD4E1D} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
{442B5058-DCAF-4263-BB6A-F21E31120A1B} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839} {442B5058-DCAF-4263-BB6A-F21E31120A1B} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
{4A4402D4-E910-443B-B8FC-2C18286A2CA0} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal

View File

@ -1,4 +1,5 @@
using System; using System;
using System.IO;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Text; using System.Text;
using MediaBrowser.Model.Cryptography; using MediaBrowser.Model.Cryptography;
@ -8,10 +9,21 @@ namespace MediaBrowser.Common.Implementations.Cryptography
public class CryptographyProvider : ICryptographyProvider public class CryptographyProvider : ICryptographyProvider
{ {
public Guid GetMD5(string str) public Guid GetMD5(string str)
{
return new Guid(GetMD5Bytes(str));
}
public byte[] GetMD5Bytes(string str)
{ {
using (var provider = MD5.Create()) using (var provider = MD5.Create())
{ {
return new Guid(provider.ComputeHash(Encoding.Unicode.GetBytes(str))); return provider.ComputeHash(Encoding.Unicode.GetBytes(str));
}
}
public byte[] GetMD5Bytes(Stream str)
{
using (var provider = MD5.Create())
{
return provider.ComputeHash(str);
} }
} }
} }

View File

@ -221,7 +221,8 @@ namespace MediaBrowser.MediaEncoding.Subtitles
private string NormalizeLanguage(string language) private string NormalizeLanguage(string language)
{ {
// Problem with Greek subtitle download #1349 // Problem with Greek subtitle download #1349
if (string.Equals (language, "gre", StringComparison.OrdinalIgnoreCase)) { if (string.Equals(language, "gre", StringComparison.OrdinalIgnoreCase))
{
return "ell"; return "ell";
} }
@ -266,7 +267,12 @@ namespace MediaBrowser.MediaEncoding.Subtitles
await Login(cancellationToken).ConfigureAwait(false); await Login(cancellationToken).ConfigureAwait(false);
var subLanguageId = NormalizeLanguage(request.Language); var subLanguageId = NormalizeLanguage(request.Language);
var hash = Utilities.ComputeHash(request.MediaPath); string hash;
using (var fileStream = File.OpenRead(request.MediaPath))
{
hash = Utilities.ComputeHash(fileStream);
}
var fileInfo = new FileInfo(request.MediaPath); var fileInfo = new FileInfo(request.MediaPath);
var movieByteSize = fileInfo.Length; var movieByteSize = fileInfo.Length;
var searchImdbId = request.ContentType == VideoContentType.Movie ? imdbId.ToString(_usCulture) : ""; var searchImdbId = request.ContentType == VideoContentType.Movie ? imdbId.ToString(_usCulture) : "";

View File

@ -1,9 +1,12 @@
using System; using System;
using System.IO;
namespace MediaBrowser.Model.Cryptography namespace MediaBrowser.Model.Cryptography
{ {
public interface ICryptographyProvider public interface ICryptographyProvider
{ {
Guid GetMD5(string str); Guid GetMD5(string str);
byte[] GetMD5Bytes(string str);
byte[] GetMD5Bytes(Stream str);
} }
} }

View File

@ -119,6 +119,7 @@ using MediaBrowser.Model.Social;
using MediaBrowser.Model.Xml; using MediaBrowser.Model.Xml;
using MediaBrowser.Server.Implementations.Reflection; using MediaBrowser.Server.Implementations.Reflection;
using MediaBrowser.Server.Implementations.Xml; using MediaBrowser.Server.Implementations.Xml;
using OpenSubtitlesHandler;
namespace MediaBrowser.Server.Startup.Common namespace MediaBrowser.Server.Startup.Common
{ {
@ -974,6 +975,7 @@ namespace MediaBrowser.Server.Startup.Common
CollectionFolder.XmlSerializer = XmlSerializer; CollectionFolder.XmlSerializer = XmlSerializer;
BaseStreamingService.AppHost = this; BaseStreamingService.AppHost = this;
BaseStreamingService.HttpClient = HttpClient; BaseStreamingService.HttpClient = HttpClient;
Utilities.CryptographyProvider = CryptographyProvider;
} }
/// <summary> /// <summary>

View File

@ -137,6 +137,10 @@
<Project>{23499896-b135-4527-8574-c26e926ea99e}</Project> <Project>{23499896-b135-4527-8574-c26e926ea99e}</Project>
<Name>MediaBrowser.XbmcMetadata</Name> <Name>MediaBrowser.XbmcMetadata</Name>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\OpenSubtitlesHandler\OpenSubtitlesHandler.csproj">
<Project>{4a4402d4-e910-443b-b8fc-2c18286a2ca0}</Project>
<Name>OpenSubtitlesHandler</Name>
</ProjectReference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="app.config" /> <None Include="app.config" />

View File

@ -37,17 +37,17 @@ namespace OpenSubtitlesHandler
protected double seconds; protected double seconds;
protected string status; protected string status;
protected virtual void LoadAttributes() protected void LoadAttributes()
{ {
foreach (Attribute attr in Attribute.GetCustomAttributes(this.GetType())) //foreach (Attribute attr in Attribute.GetCustomAttributes(this.GetType()))
{ //{
if (attr.GetType() == typeof(MethodResponseDescription)) // if (attr.GetType() == typeof(MethodResponseDescription))
{ // {
this.name = ((MethodResponseDescription)attr).Name; // this.name = ((MethodResponseDescription)attr).Name;
this.message = ((MethodResponseDescription)attr).Message; // this.message = ((MethodResponseDescription)attr).Message;
break; // break;
} // }
} //}
} }
[Description("The name of this response"), Category("MethodResponse")] [Description("The name of this response"), Category("MethodResponse")]
@ -59,4 +59,14 @@ namespace OpenSubtitlesHandler
[Description("The status"), Category("MethodResponse")] [Description("The status"), Category("MethodResponse")]
public string Status { get { return status; } set { status = value; } } public string Status { get { return status; } set { status = value; } }
} }
public class DescriptionAttribute : Attribute
{
public DescriptionAttribute(string text) { }
}
public class CategoryAttribute : Attribute
{
public CategoryAttribute(string text) { }
}
} }

View File

@ -12,7 +12,11 @@
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion> <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir> <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<TargetFrameworkProfile /> <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<TargetFrameworkProfile>
</TargetFrameworkProfile>
<TargetFrameworkVersion>v5.0</TargetFrameworkVersion>
<MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
@ -36,15 +40,6 @@
<OutputPath>bin\Release Mono</OutputPath> <OutputPath>bin\Release Mono</OutputPath>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Console\OSHConsole.cs" /> <Compile Include="Console\OSHConsole.cs" />
<Compile Include="Interfaces\IMethodResponse.cs" /> <Compile Include="Interfaces\IMethodResponse.cs" />
@ -119,7 +114,10 @@
<ItemGroup> <ItemGroup>
<Content Include="XML-RPC\Docs\XML-RPC.txt" /> <Content Include="XML-RPC\Docs\XML-RPC.txt" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <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. <!-- 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. Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild"> <Target Name="BeforeBuild">

View File

@ -20,10 +20,10 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using System.IO; using System.IO;
using System.Security.Cryptography;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using MediaBrowser.Common.Net; using MediaBrowser.Common.Net;
using MediaBrowser.Model.Cryptography;
namespace OpenSubtitlesHandler namespace OpenSubtitlesHandler
{ {
@ -32,50 +32,33 @@ namespace OpenSubtitlesHandler
/// </summary> /// </summary>
public sealed class Utilities public sealed class Utilities
{ {
public static ICryptographyProvider CryptographyProvider { get; set; }
private const string XML_RPC_SERVER = "https://api.opensubtitles.org/xml-rpc"; private const string XML_RPC_SERVER = "https://api.opensubtitles.org/xml-rpc";
/// <summary> /// <summary>
/// Compute movie hash /// Compute movie hash
/// </summary> /// </summary>
/// <param name="fileName">The complete media file path</param>
/// <returns>The hash as Hexadecimal string</returns> /// <returns>The hash as Hexadecimal string</returns>
public static string ComputeHash(string fileName) public static string ComputeHash(Stream stream)
{ {
byte[] hash = MovieHasher.ComputeMovieHash(File.OpenRead(fileName)); byte[] hash = MovieHasher.ComputeMovieHash(stream);
return MovieHasher.ToHexadecimal(hash); return MovieHasher.ToHexadecimal(hash);
} }
/// <summary> /// <summary>
/// Compute md5 for a file
/// </summary>
/// <param name="filename">The complete file path</param>
/// <returns>MD5 of the file</returns>
public static string ComputeMd5(string filename)
{
var md5 = MD5.Create();
var sb = new StringBuilder();
Stream str = new FileStream(filename, FileMode.Open, FileAccess.Read);
foreach (var b in md5.ComputeHash(str))
sb.Append(b.ToString("x2").ToLower());
str.Close();
return sb.ToString();
}
/// <summary>
/// Decompress data using GZip /// Decompress data using GZip
/// </summary> /// </summary>
/// <param name="dataToDecompress">The stream that hold the data</param> /// <param name="dataToDecompress">The stream that hold the data</param>
/// <returns>Bytes array of decompressed data</returns> /// <returns>Bytes array of decompressed data</returns>
public static byte[] Decompress(Stream dataToDecompress) public static byte[] Decompress(Stream dataToDecompress)
{ {
MemoryStream target = new MemoryStream(); using (MemoryStream target = new MemoryStream())
{
using (System.IO.Compression.GZipStream decompressionStream = new System.IO.Compression.GZipStream(dataToDecompress, using (System.IO.Compression.GZipStream decompressionStream = new System.IO.Compression.GZipStream(dataToDecompress, System.IO.Compression.CompressionMode.Decompress))
System.IO.Compression.CompressionMode.Decompress))
{ {
decompressionStream.CopyTo(target); decompressionStream.CopyTo(target);
} }
return target.GetBuffer(); return target.ToArray();
}
} }
/// <summary> /// <summary>
@ -126,6 +109,8 @@ namespace OpenSubtitlesHandler
/// <param name="encoding">The encoding that should be used to decode buffer</param> /// <param name="encoding">The encoding that should be used to decode buffer</param>
/// <returns>The string of the stream after decode using given encoding</returns> /// <returns>The string of the stream after decode using given encoding</returns>
public static string GetStreamString(Stream responseStream, Encoding encoding) public static string GetStreamString(Stream responseStream, Encoding encoding)
{
using (responseStream)
{ {
// Handle response, should be XML text. // Handle response, should be XML text.
List<byte> data = new List<byte>(); List<byte> data = new List<byte>();
@ -136,9 +121,9 @@ namespace OpenSubtitlesHandler
break; break;
data.Add((byte)r); data.Add((byte)r);
} }
responseStream.Close();
return encoding.GetString(data.ToArray()); return encoding.GetString(data.ToArray());
} }
}
/// <summary> /// <summary>
/// Handle server response stream and decode it as ASCII encoding string. /// Handle server response stream and decode it as ASCII encoding string.
/// </summary> /// </summary>

View File

@ -233,32 +233,41 @@ namespace XmlRpcHandler
} }
private static readonly CultureInfo UsCulture = new CultureInfo("en-US"); private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
private static IXmlRpcValue ReadValue(XmlReader xmlReader) private static string ReadString(XmlReader reader)
{ {
while (xmlReader.Read()) if (reader.NodeType == XmlNodeType.Element)
{
return reader.ReadElementContentAsString();
}
return reader.ReadContentAsString();
}
private static IXmlRpcValue ReadValue(XmlReader xmlReader, bool skipRead = false)
{
while (skipRead || xmlReader.Read())
{ {
if (xmlReader.Name == "value" && xmlReader.IsStartElement()) if (xmlReader.Name == "value" && xmlReader.IsStartElement())
{ {
xmlReader.Read(); xmlReader.Read();
if (xmlReader.Name == "string" && xmlReader.IsStartElement()) if (xmlReader.Name == "string" && xmlReader.IsStartElement())
{ {
return new XmlRpcValueBasic(xmlReader.ReadString(), XmlRpcBasicValueType.String); return new XmlRpcValueBasic(ReadString(xmlReader), XmlRpcBasicValueType.String);
} }
else if (xmlReader.Name == "int" && xmlReader.IsStartElement()) else if (xmlReader.Name == "int" && xmlReader.IsStartElement())
{ {
return new XmlRpcValueBasic(int.Parse(xmlReader.ReadString(), UsCulture), XmlRpcBasicValueType.Int); return new XmlRpcValueBasic(int.Parse(ReadString(xmlReader), UsCulture), XmlRpcBasicValueType.Int);
} }
else if (xmlReader.Name == "boolean" && xmlReader.IsStartElement()) else if (xmlReader.Name == "boolean" && xmlReader.IsStartElement())
{ {
return new XmlRpcValueBasic(xmlReader.ReadString() == "1", XmlRpcBasicValueType.Boolean); return new XmlRpcValueBasic(ReadString(xmlReader) == "1", XmlRpcBasicValueType.Boolean);
} }
else if (xmlReader.Name == "double" && xmlReader.IsStartElement()) else if (xmlReader.Name == "double" && xmlReader.IsStartElement())
{ {
return new XmlRpcValueBasic(double.Parse(xmlReader.ReadString(), UsCulture), XmlRpcBasicValueType.Double); return new XmlRpcValueBasic(double.Parse(ReadString(xmlReader), UsCulture), XmlRpcBasicValueType.Double);
} }
else if (xmlReader.Name == "dateTime.iso8601" && xmlReader.IsStartElement()) else if (xmlReader.Name == "dateTime.iso8601" && xmlReader.IsStartElement())
{ {
string date = xmlReader.ReadString(); string date = ReadString(xmlReader);
int year = int.Parse(date.Substring(0, 4), UsCulture); int year = int.Parse(date.Substring(0, 4), UsCulture);
int month = int.Parse(date.Substring(4, 2), UsCulture); int month = int.Parse(date.Substring(4, 2), UsCulture);
int day = int.Parse(date.Substring(6, 2), UsCulture); int day = int.Parse(date.Substring(6, 2), UsCulture);
@ -270,7 +279,7 @@ namespace XmlRpcHandler
} }
else if (xmlReader.Name == "base64" && xmlReader.IsStartElement()) else if (xmlReader.Name == "base64" && xmlReader.IsStartElement())
{ {
return new XmlRpcValueBasic(BitConverter.ToInt64(Convert.FromBase64String(xmlReader.ReadString()), 0) return new XmlRpcValueBasic(BitConverter.ToInt64(Convert.FromBase64String(ReadString(xmlReader)), 0)
, XmlRpcBasicValueType.Double); , XmlRpcBasicValueType.Double);
} }
else if (xmlReader.Name == "struct" && xmlReader.IsStartElement()) else if (xmlReader.Name == "struct" && xmlReader.IsStartElement())
@ -283,9 +292,9 @@ namespace XmlRpcHandler
{ {
XmlRpcStructMember member = new XmlRpcStructMember("", null); XmlRpcStructMember member = new XmlRpcStructMember("", null);
xmlReader.Read();// read name xmlReader.Read();// read name
member.Name = xmlReader.ReadString(); member.Name = ReadString(xmlReader);
IXmlRpcValue val = ReadValue(xmlReader); IXmlRpcValue val = ReadValue(xmlReader, true);
if (val != null) if (val != null)
{ {
member.Data = val; member.Data = val;
@ -320,6 +329,11 @@ namespace XmlRpcHandler
} }
} }
else break; else break;
if (skipRead)
{
return null;
}
} }
return null; return null;
} }

View File

@ -0,0 +1,15 @@
{
"supports": {
"net46.app": {},
"dnxcore50.app": {}
},
"dependencies": {
"Microsoft.NETCore": "5.0.0",
"Microsoft.NETCore.Portable.Compatibility": "1.0.0"
},
"frameworks": {
"dotnet": {
"imports": "portable-net452"
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -24,6 +24,7 @@
<ProjectReference Include="..\..\MediaBrowser.Providers\MediaBrowser.Providers.csproj" /> <ProjectReference Include="..\..\MediaBrowser.Providers\MediaBrowser.Providers.csproj" />
<ProjectReference Include="..\..\MediaBrowser.WebDashboard\MediaBrowser.WebDashboard.csproj" /> <ProjectReference Include="..\..\MediaBrowser.WebDashboard\MediaBrowser.WebDashboard.csproj" />
<ProjectReference Include="..\..\MediaBrowser.XbmcMetadata\MediaBrowser.XbmcMetadata.csproj" /> <ProjectReference Include="..\..\MediaBrowser.XbmcMetadata\MediaBrowser.XbmcMetadata.csproj" />
<ProjectReference Include="..\..\OpenSubtitlesHandler\OpenSubtitlesHandler.csproj" />
</ItemGroup> </ItemGroup>
<Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.targets" Condition="'$(VSToolsPath)' != ''" /> <Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.targets" Condition="'$(VSToolsPath)' != ''" />
</Project> </Project>

View File

@ -7033,6 +7033,23 @@
"copyToOutput": true "copyToOutput": true
} }
} }
},
"OpenSubtitlesHandler/1.0.0": {
"type": "project",
"framework": ".NETFramework,Version=v4.6",
"compile": {
"bin/Debug/OpenSubtitlesHandler.dll": {}
},
"runtime": {
"bin/Debug/OpenSubtitlesHandler.dll": {}
},
"contentFiles": {
"bin/Debug/OpenSubtitlesHandler.pdb": {
"buildAction": "None",
"codeLanguage": "any",
"copyToOutput": true
}
}
} }
} }
} }

View File

@ -38,6 +38,9 @@
}, },
"MediaBrowser.XbmcMetadata": { "MediaBrowser.XbmcMetadata": {
"target": "project" "target": "project"
},
"OpenSubtitlesHandler": {
"target": "project"
} }
} }
} }

View File

@ -2205,6 +2205,16 @@
"MediaBrowser.Model": "1.0.0", "MediaBrowser.Model": "1.0.0",
"NETStandard.Library": "1.6.0" "NETStandard.Library": "1.6.0"
} }
},
"OpenSubtitlesHandler/1.0.0": {
"type": "project",
"framework": ".NETPlatform,Version=v5.0",
"dependencies": {
"MediaBrowser.Common": "1.0.0",
"MediaBrowser.Model": "1.0.0",
"Microsoft.NETCore": "5.0.0",
"Microsoft.NETCore.Portable.Compatibility": "1.0.0"
}
} }
} }
}, },
@ -6978,6 +6988,11 @@
"type": "project", "type": "project",
"path": "../../MediaBrowser.XbmcMetadata/project.json", "path": "../../MediaBrowser.XbmcMetadata/project.json",
"msbuildProject": "../../MediaBrowser.XbmcMetadata/MediaBrowser.XbmcMetadata.csproj" "msbuildProject": "../../MediaBrowser.XbmcMetadata/MediaBrowser.XbmcMetadata.csproj"
},
"OpenSubtitlesHandler/1.0.0": {
"type": "project",
"path": "../../OpenSubtitlesHandler/project.json",
"msbuildProject": "../../OpenSubtitlesHandler/OpenSubtitlesHandler.csproj"
} }
}, },
"projectFileDependencyGroups": { "projectFileDependencyGroups": {
@ -6992,7 +7007,8 @@
"MediaBrowser.Model", "MediaBrowser.Model",
"MediaBrowser.Providers", "MediaBrowser.Providers",
"MediaBrowser.WebDashboard", "MediaBrowser.WebDashboard",
"MediaBrowser.XbmcMetadata" "MediaBrowser.XbmcMetadata",
"OpenSubtitlesHandler"
] ]
}, },
"tools": {}, "tools": {},