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
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Providers", "MediaBrowser.Providers\MediaBrowser.Providers.csproj", "{442B5058-DCAF-4263-BB6A-F21E31120A1B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSubtitlesHandler", "OpenSubtitlesHandler\OpenSubtitlesHandler.csproj", "{4A4402D4-E910-443B-B8FC-2C18286A2CA0}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
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|Any CPU.ActiveCfg = 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
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -121,5 +129,6 @@ Global
{88AE38DF-19D7-406F-A6A9-09527719A21E} = {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}
{4A4402D4-E910-443B-B8FC-2C18286A2CA0} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
EndGlobalSection
EndGlobal

View File

@ -1,4 +1,5 @@
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using MediaBrowser.Model.Cryptography;
@ -8,10 +9,21 @@ namespace MediaBrowser.Common.Implementations.Cryptography
public class CryptographyProvider : ICryptographyProvider
{
public Guid GetMD5(string str)
{
return new Guid(GetMD5Bytes(str));
}
public byte[] GetMD5Bytes(string str)
{
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

@ -218,16 +218,17 @@ namespace MediaBrowser.MediaEncoding.Subtitles
});
}
private string NormalizeLanguage(string language)
{
// Problem with Greek subtitle download #1349
if (string.Equals (language, "gre", StringComparison.OrdinalIgnoreCase)) {
return "ell";
}
private string NormalizeLanguage(string language)
{
// Problem with Greek subtitle download #1349
if (string.Equals(language, "gre", StringComparison.OrdinalIgnoreCase))
{
return language;
}
return "ell";
}
return language;
}
public async Task<IEnumerable<RemoteSubtitleInfo>> Search(SubtitleSearchRequest request, CancellationToken cancellationToken)
{
@ -265,14 +266,19 @@ namespace MediaBrowser.MediaEncoding.Subtitles
await Login(cancellationToken).ConfigureAwait(false);
var subLanguageId = NormalizeLanguage(request.Language);
var hash = Utilities.ComputeHash(request.MediaPath);
var subLanguageId = NormalizeLanguage(request.Language);
string hash;
using (var fileStream = File.OpenRead(request.MediaPath))
{
hash = Utilities.ComputeHash(fileStream);
}
var fileInfo = new FileInfo(request.MediaPath);
var movieByteSize = fileInfo.Length;
var searchImdbId = request.ContentType == VideoContentType.Movie ? imdbId.ToString(_usCulture) : "";
var subtitleSearchParameters = request.ContentType == VideoContentType.Episode
? new List<SubtitleSearchParameters> {
new SubtitleSearchParameters(subLanguageId,
new SubtitleSearchParameters(subLanguageId,
query: request.SeriesName,
season: request.ParentIndexNumber.Value.ToString(_usCulture),
episode: request.IndexNumber.Value.ToString(_usCulture))
@ -282,9 +288,9 @@ namespace MediaBrowser.MediaEncoding.Subtitles
new SubtitleSearchParameters(subLanguageId, query: request.Name, imdbid: searchImdbId)
};
var parms = new List<SubtitleSearchParameters> {
new SubtitleSearchParameters( subLanguageId,
movieHash: hash,
movieByteSize: movieByteSize,
new SubtitleSearchParameters( subLanguageId,
movieHash: hash,
movieByteSize: movieByteSize,
imdbid: searchImdbId ),
};
parms.AddRange(subtitleSearchParameters);

View File

@ -1,9 +1,12 @@
using System;
using System.IO;
namespace MediaBrowser.Model.Cryptography
{
public interface ICryptographyProvider
{
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.Server.Implementations.Reflection;
using MediaBrowser.Server.Implementations.Xml;
using OpenSubtitlesHandler;
namespace MediaBrowser.Server.Startup.Common
{
@ -974,6 +975,7 @@ namespace MediaBrowser.Server.Startup.Common
CollectionFolder.XmlSerializer = XmlSerializer;
BaseStreamingService.AppHost = this;
BaseStreamingService.HttpClient = HttpClient;
Utilities.CryptographyProvider = CryptographyProvider;
}
/// <summary>

View File

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

View File

@ -37,17 +37,17 @@ namespace OpenSubtitlesHandler
protected double seconds;
protected string status;
protected virtual void LoadAttributes()
protected void LoadAttributes()
{
foreach (Attribute attr in Attribute.GetCustomAttributes(this.GetType()))
{
if (attr.GetType() == typeof(MethodResponseDescription))
{
this.name = ((MethodResponseDescription)attr).Name;
this.message = ((MethodResponseDescription)attr).Message;
break;
}
}
//foreach (Attribute attr in Attribute.GetCustomAttributes(this.GetType()))
//{
// if (attr.GetType() == typeof(MethodResponseDescription))
// {
// this.name = ((MethodResponseDescription)attr).Name;
// this.message = ((MethodResponseDescription)attr).Message;
// break;
// }
//}
}
[Description("The name of this response"), Category("MethodResponse")]
@ -59,4 +59,14 @@ namespace OpenSubtitlesHandler
[Description("The status"), Category("MethodResponse")]
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>
<FileAlignment>512</FileAlignment>
<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 Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@ -36,15 +40,6 @@
<OutputPath>bin\Release Mono</OutputPath>
<WarningLevel>4</WarningLevel>
</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>
<Compile Include="Console\OSHConsole.cs" />
<Compile Include="Interfaces\IMethodResponse.cs" />
@ -119,7 +114,10 @@
<ItemGroup>
<Content Include="XML-RPC\Docs\XML-RPC.txt" />
</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.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">

View File

@ -20,10 +20,10 @@ using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Security.Cryptography;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Common.Net;
using MediaBrowser.Model.Cryptography;
namespace OpenSubtitlesHandler
{
@ -32,50 +32,33 @@ namespace OpenSubtitlesHandler
/// </summary>
public sealed class Utilities
{
public static ICryptographyProvider CryptographyProvider { get; set; }
private const string XML_RPC_SERVER = "https://api.opensubtitles.org/xml-rpc";
/// <summary>
/// Compute movie hash
/// </summary>
/// <param name="fileName">The complete media file path</param>
/// <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);
}
/// <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
/// </summary>
/// <param name="dataToDecompress">The stream that hold the data</param>
/// <returns>Bytes array of decompressed data</returns>
public static byte[] Decompress(Stream dataToDecompress)
{
MemoryStream target = new MemoryStream();
using (System.IO.Compression.GZipStream decompressionStream = new System.IO.Compression.GZipStream(dataToDecompress,
System.IO.Compression.CompressionMode.Decompress))
using (MemoryStream target = new MemoryStream())
{
decompressionStream.CopyTo(target);
using (System.IO.Compression.GZipStream decompressionStream = new System.IO.Compression.GZipStream(dataToDecompress, System.IO.Compression.CompressionMode.Decompress))
{
decompressionStream.CopyTo(target);
}
return target.ToArray();
}
return target.GetBuffer();
}
/// <summary>
@ -127,17 +110,19 @@ namespace OpenSubtitlesHandler
/// <returns>The string of the stream after decode using given encoding</returns>
public static string GetStreamString(Stream responseStream, Encoding encoding)
{
// Handle response, should be XML text.
List<byte> data = new List<byte>();
while (true)
using (responseStream)
{
int r = responseStream.ReadByte();
if (r < 0)
break;
data.Add((byte)r);
// Handle response, should be XML text.
List<byte> data = new List<byte>();
while (true)
{
int r = responseStream.ReadByte();
if (r < 0)
break;
data.Add((byte)r);
}
return encoding.GetString(data.ToArray());
}
responseStream.Close();
return encoding.GetString(data.ToArray());
}
/// <summary>
/// Handle server response stream and decode it as ASCII encoding string.

View File

@ -232,33 +232,42 @@ namespace XmlRpcHandler
XMLwrt.WriteEndElement();//value
}
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())
{
xmlReader.Read();
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())
{
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())
{
return new XmlRpcValueBasic(xmlReader.ReadString() == "1", XmlRpcBasicValueType.Boolean);
return new XmlRpcValueBasic(ReadString(xmlReader) == "1", XmlRpcBasicValueType.Boolean);
}
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())
{
string date = xmlReader.ReadString();
string date = ReadString(xmlReader);
int year = int.Parse(date.Substring(0, 4), UsCulture);
int month = int.Parse(date.Substring(4, 2), UsCulture);
int day = int.Parse(date.Substring(6, 2), UsCulture);
@ -270,7 +279,7 @@ namespace XmlRpcHandler
}
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);
}
else if (xmlReader.Name == "struct" && xmlReader.IsStartElement())
@ -283,9 +292,9 @@ namespace XmlRpcHandler
{
XmlRpcStructMember member = new XmlRpcStructMember("", null);
xmlReader.Read();// read name
member.Name = xmlReader.ReadString();
member.Name = ReadString(xmlReader);
IXmlRpcValue val = ReadValue(xmlReader);
IXmlRpcValue val = ReadValue(xmlReader, true);
if (val != null)
{
member.Data = val;
@ -320,6 +329,11 @@ namespace XmlRpcHandler
}
}
else break;
if (skipRead)
{
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.WebDashboard\MediaBrowser.WebDashboard.csproj" />
<ProjectReference Include="..\..\MediaBrowser.XbmcMetadata\MediaBrowser.XbmcMetadata.csproj" />
<ProjectReference Include="..\..\OpenSubtitlesHandler\OpenSubtitlesHandler.csproj" />
</ItemGroup>
<Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.targets" Condition="'$(VSToolsPath)' != ''" />
</Project>

View File

@ -7033,6 +7033,23 @@
"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": {
"target": "project"
},
"OpenSubtitlesHandler": {
"target": "project"
}
}
}

View File

@ -2205,6 +2205,16 @@
"MediaBrowser.Model": "1.0.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",
"path": "../../MediaBrowser.XbmcMetadata/project.json",
"msbuildProject": "../../MediaBrowser.XbmcMetadata/MediaBrowser.XbmcMetadata.csproj"
},
"OpenSubtitlesHandler/1.0.0": {
"type": "project",
"path": "../../OpenSubtitlesHandler/project.json",
"msbuildProject": "../../OpenSubtitlesHandler/OpenSubtitlesHandler.csproj"
}
},
"projectFileDependencyGroups": {
@ -6992,7 +7007,8 @@
"MediaBrowser.Model",
"MediaBrowser.Providers",
"MediaBrowser.WebDashboard",
"MediaBrowser.XbmcMetadata"
"MediaBrowser.XbmcMetadata",
"OpenSubtitlesHandler"
]
},
"tools": {},