From 4d6b80f5f7ad2df332ff76bbe88c35215ff5e296 Mon Sep 17 00:00:00 2001 From: Meiam <91270@qq.com> Date: Thu, 1 Jul 2021 15:56:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=B0=84=E6=89=8B=E5=BD=B1?= =?UTF-8?q?=E9=9F=B3=E5=AD=97=E5=B9=95=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Emby.MeiamSub.DevTool/Program.cs | 56 +++- .../Emby.MeiamSub.Shooter.csproj | 23 ++ .../Model/DownloadSubInfo.cs | 15 + .../Model/SubtitleResponseRoot.cs | 19 ++ Emby.MeiamSub.Shooter/Plugin.cs | 44 +++ Emby.MeiamSub.Shooter/ShooterProvider.cs | 300 ++++++++++++++++++ Emby.MeiamSub.Shooter/Thumb.png | Bin 0 -> 17825 bytes .../Emby.MeiamSub.Thunder.csproj | 6 + Emby.MeiamSub.Thunder/Plugin.cs | 2 +- Emby.MeiamSub.Thunder/Thumb.png | Bin 15465 -> 16907 bytes Emby.MeiamSub.Thunder/ThunderProvider.cs | 30 +- Emby.MeiamSub.sln | 6 + 12 files changed, 487 insertions(+), 14 deletions(-) create mode 100644 Emby.MeiamSub.Shooter/Emby.MeiamSub.Shooter.csproj create mode 100644 Emby.MeiamSub.Shooter/Model/DownloadSubInfo.cs create mode 100644 Emby.MeiamSub.Shooter/Model/SubtitleResponseRoot.cs create mode 100644 Emby.MeiamSub.Shooter/Plugin.cs create mode 100644 Emby.MeiamSub.Shooter/ShooterProvider.cs create mode 100644 Emby.MeiamSub.Shooter/Thumb.png diff --git a/Emby.MeiamSub.DevTool/Program.cs b/Emby.MeiamSub.DevTool/Program.cs index 9b305e4..9dc2955 100644 --- a/Emby.MeiamSub.DevTool/Program.cs +++ b/Emby.MeiamSub.DevTool/Program.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Security.Cryptography; +using System.Text; namespace Emby.Subtitle.DevTool { @@ -8,11 +9,12 @@ namespace Emby.Subtitle.DevTool { static void Main(string[] args) { - Console.WriteLine(getCid($"X:\\Download\\冰路营救 (2021)\\冰路营救 (2021) 1080p AC3.mkv")); + //Console.WriteLine(ComputeFileHash($"X:\\Download\\喋血战士 (2020)\\喋血战士 (2020) 1080p AAC.mp4")); + Console.WriteLine(ComputeFileHash($"D:\\Documents\\Downloads\\testidx.avi")); Console.ReadKey(); } - private static string getCid(string filePath) + private static string GetCid(string filePath) { var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read); var reader = new BinaryReader(stream); @@ -37,9 +39,57 @@ namespace Emby.Subtitle.DevTool var result = ""; foreach (var i in buffer) { - result += String.Format("{0:X2}", i); + result += string.Format("{0:X2}", i); } return result; } + + public static string ComputeFileHash(string filePath) + { + FileInfo fileInfo = new FileInfo(filePath); + + string ret = ""; + + if (!fileInfo.Exists || fileInfo.Length < 8 * 1024) + { + return ret; + } + + FileStream fs = new FileStream(fileInfo.FullName, FileMode.Open, FileAccess.Read); + + long[] offset = new long[4]; + offset[3] = fileInfo.Length - 8 * 1024; + offset[2] = fileInfo.Length / 3; + offset[1] = fileInfo.Length / 3 * 2; + offset[0] = 4 * 1024; + + byte[] bBuf = new byte[1024 * 4]; + + for (int i = 0; i < 4; ++i) + { + fs.Seek(offset[i], 0); + fs.Read(bBuf, 0, 4 * 1024); + + MD5 md5Hash = MD5.Create(); + byte[] data = md5Hash.ComputeHash(bBuf); + StringBuilder sBuilder = new StringBuilder(); + + for (int j = 0; j < data.Length; j++) + { + sBuilder.Append(data[j].ToString("x2")); + } + + if (!string.IsNullOrEmpty(ret)) + { + ret += ";"; + } + + ret += sBuilder.ToString(); + } + + fs.Close(); + + return ret; + } } } diff --git a/Emby.MeiamSub.Shooter/Emby.MeiamSub.Shooter.csproj b/Emby.MeiamSub.Shooter/Emby.MeiamSub.Shooter.csproj new file mode 100644 index 0000000..4b5e221 --- /dev/null +++ b/Emby.MeiamSub.Shooter/Emby.MeiamSub.Shooter.csproj @@ -0,0 +1,23 @@ + + + 1.0.1.0 + 1.0.1.0 + 1.0.1 + + + netcoreapp3.1 + + + 2 + + + + + + + + + + + + \ No newline at end of file diff --git a/Emby.MeiamSub.Shooter/Model/DownloadSubInfo.cs b/Emby.MeiamSub.Shooter/Model/DownloadSubInfo.cs new file mode 100644 index 0000000..5e530f0 --- /dev/null +++ b/Emby.MeiamSub.Shooter/Model/DownloadSubInfo.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Emby.MeiamSub.Shooter.Model +{ + public class DownloadSubInfo + { + public string Url { get; set; } + public string Format { get; set; } + public string Language { get; set; } + public string TwoLetterISOLanguageName { get; set; } + public bool? IsForced { get; set; } + } +} diff --git a/Emby.MeiamSub.Shooter/Model/SubtitleResponseRoot.cs b/Emby.MeiamSub.Shooter/Model/SubtitleResponseRoot.cs new file mode 100644 index 0000000..97baa4f --- /dev/null +++ b/Emby.MeiamSub.Shooter/Model/SubtitleResponseRoot.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace Emby.MeiamSub.Shooter.Model +{ + public class SubtitleResponseRoot + { + public string Desc { get; set; } + public int Delay { get; set; } + public SubFileInfo[] Files { get; set; } + } + + public class SubFileInfo + { + public string Ext { get; set; } + public string Link { get; set; } + } + +} diff --git a/Emby.MeiamSub.Shooter/Plugin.cs b/Emby.MeiamSub.Shooter/Plugin.cs new file mode 100644 index 0000000..145dc0a --- /dev/null +++ b/Emby.MeiamSub.Shooter/Plugin.cs @@ -0,0 +1,44 @@ +using MediaBrowser.Common.Plugins; +using MediaBrowser.Model.Drawing; +using System; +using System.IO; + +namespace Emby.MeiamSub.Shooter +{ + + /// + /// 插件入口 + /// + public class Plugin : BasePlugin, IHasThumbImage + { + /// + /// 插件ID + /// + public override Guid Id => new Guid("038D37A2-7A1E-4C01-9B6D-AA215D29AB4C"); + + /// + /// 插件名称 + /// + public override string Name => "MeiamSub.Shooter"; + + /// + /// 插件描述 + /// + public override string Description => "Download subtitles from Shooter"; + + /// + /// 缩略图格式化类型 + /// + public ImageFormat ThumbImageFormat => ImageFormat.Gif; + + /// + /// 缩略图资源文件 + /// + /// + public Stream GetThumbImage() + { + var type = GetType(); + return type.Assembly.GetManifestResourceStream(type.Namespace + ".Thumb.png"); + } + } +} diff --git a/Emby.MeiamSub.Shooter/ShooterProvider.cs b/Emby.MeiamSub.Shooter/ShooterProvider.cs new file mode 100644 index 0000000..060124a --- /dev/null +++ b/Emby.MeiamSub.Shooter/ShooterProvider.cs @@ -0,0 +1,300 @@ +using Emby.MeiamSub.Shooter.Model; +using MediaBrowser.Common.Net; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Controller.Subtitles; +using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Providers; +using MediaBrowser.Model.Serialization; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Security.Cryptography; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Web; + +namespace Emby.MeiamSub.Shooter +{ + /// + /// 迅雷字幕组件 + /// + public class ShooterProvider : ISubtitleProvider, IHasOrder + { + #region 变量声明 + public const string ASS = "ass"; + public const string SSA = "ssa"; + public const string SRT = "srt"; + + private readonly ILogger _logger; + private readonly IJsonSerializer _jsonSerializer; + private readonly IHttpClient _httpClient; + + public int Order => 0; + public string Name => "MeiamSub.Shooter"; + + /// + /// 支持电影、剧集 + /// + public IEnumerable SupportedMediaTypes => new List() { VideoContentType.Movie, VideoContentType.Episode }; + #endregion + + #region 构造函数 + public ShooterProvider(ILogger logger, IJsonSerializer jsonSerializer,IHttpClient httpClient) + { + _logger = logger; + _jsonSerializer = jsonSerializer; + _httpClient = httpClient; + } + #endregion + + #region 查询字幕 + + /// + /// 查询请求 + /// + /// + /// + /// + public async Task> Search(SubtitleSearchRequest request, CancellationToken cancellationToken) + { + _logger.Debug($"MeiamSub.Shooter Search | Request -> { _jsonSerializer.SerializeToString(request) }"); + + var subtitles = await SearchSubtitlesAsync(request); + + return subtitles; + } + + /// + /// 查询字幕 + /// + /// + /// + private async Task> SearchSubtitlesAsync(SubtitleSearchRequest request) + { + if (request.Language != "chi" && request.Language != "eng") + { + return Array.Empty(); + } + + FileInfo fileInfo = new FileInfo(request.MediaPath); + + var hash = ComputeFileHash(fileInfo); + + HttpRequestOptions options = new HttpRequestOptions + { + Url = $"http://shooter.cn/api/subapi.php", + UserAgent = "Emby.MeiamSub.Shooter", + AcceptHeader = "*/*", + }; + + options.SetPostData(new Dictionary + { + { "filehash", HttpUtility.UrlEncode(hash)}, + { "pathinfo", HttpUtility.UrlEncode(request.MediaPath)}, + { "format", "json"}, + { "lang",request.Language == "chi" ? "chn" : "eng"} + }); + + _logger.Debug($"MeiamSub.Shooter Search | Request -> { _jsonSerializer.SerializeToString(options) }"); + + var response = await _httpClient.Post(options); + + _logger.Debug($"MeiamSub.Shooter Search | Response -> { _jsonSerializer.SerializeToString(response) }"); + + if (response.StatusCode == HttpStatusCode.OK) + { + var subtitleResponse = _jsonSerializer.DeserializeFromStream>(response.Content); + + if (subtitleResponse != null) + { + _logger.Debug($"MeiamSub.Shooter Search | Response -> { _jsonSerializer.SerializeToString(subtitleResponse) }"); + + var remoteSubtitleInfos = new List(); + + foreach(var subFileInfo in subtitleResponse) + { + foreach(var subFile in subFileInfo.Files) + { + remoteSubtitleInfos.Add(new RemoteSubtitleInfo() + { + Id = Base64Encode(_jsonSerializer.SerializeToString(new DownloadSubInfo + { + Url = subFile.Link, + Format = subFile.Ext, + Language = request.Language, + TwoLetterISOLanguageName = request.TwoLetterISOLanguageName, + IsForced = request.IsForced + })), + Name = $"[MEIAMSUB] { Path.GetFileName(request.MediaPath) } | {request.TwoLetterISOLanguageName} | 射手", + Author = "Meiam ", + ProviderName = "MeiamSub.Shooter", + Format = subFile.Ext, + Comment = $"Format : { ExtractFormat(subFile.Ext)}" + }); + } + } + + _logger.Debug($"MeiamSub.Shooter Search | Summary -> Get { remoteSubtitleInfos.Count } Subtitles"); + + return remoteSubtitleInfos; + } + } + + _logger.Debug($"MeiamSub.Shooter Search | Summary -> Get 0 Subtitles"); + + return Array.Empty(); + } + #endregion + + #region 下载字幕 + /// + /// 下载请求 + /// + /// + /// + /// + public async Task GetSubtitles(string id, CancellationToken cancellationToken) + { + await Task.Run(() => + { + _logger.Debug($"MeiamSub.Shooter DownloadSub | Request -> {id}"); + }); + + return await DownloadSubAsync(id); + } + + /// + /// 下载字幕 + /// + /// + /// + private async Task DownloadSubAsync(string info) + { + var downloadSub = _jsonSerializer.DeserializeFromString(Base64Decode(info)); + + _logger.Debug($"MeiamSub.Shooter DownloadSub | Url -> { downloadSub.Url } | Format -> { downloadSub.Format } | Language -> { downloadSub.Language } "); + + var response = await _httpClient.GetResponse(new HttpRequestOptions + { + Url = downloadSub.Url + }); + + _logger.Debug($"MeiamSub.Shooter DownloadSub | Response -> { response.StatusCode }"); + + if (response.StatusCode == HttpStatusCode.OK) + { + + return new SubtitleResponse() + { + Language = downloadSub.Language, + IsForced = false, + Format = downloadSub.Format, + Stream = response.Content, + }; + } + + return new SubtitleResponse(); + + } + #endregion + + #region 内部方法 + + /// + /// Base64 加密 + /// + /// 明文 + /// + public static string Base64Encode(string plainText) + { + var plainTextBytes = Encoding.UTF8.GetBytes(plainText); + return Convert.ToBase64String(plainTextBytes); + } + /// + /// Base64 解密 + /// + /// + /// + public static string Base64Decode(string base64EncodedData) + { + var base64EncodedBytes = Convert.FromBase64String(base64EncodedData); + return Encoding.UTF8.GetString(base64EncodedBytes); + } + + /// + /// 提取格式化字幕类型 + /// + /// + /// + protected string ExtractFormat(string text) + { + + string result = null; + + if (text != null) + { + text = text.ToLower(); + if (text.Contains(ASS)) result = ASS; + else if (text.Contains(SSA)) result = SSA; + else if (text.Contains(SRT)) result = SRT; + else result = null; + } + return result; + } + + /// + /// 获取文件 Hash (射手) + /// + /// + /// + public static string ComputeFileHash(FileInfo fileInfo) + { + string ret = ""; + + if (!fileInfo.Exists || fileInfo.Length < 8 * 1024) + { + return ret; + } + + FileStream fs = new FileStream(fileInfo.FullName, FileMode.Open, FileAccess.Read); + + long[] offset = new long[4]; + offset[3] = fileInfo.Length - 8 * 1024; + offset[2] = fileInfo.Length / 3; + offset[1] = fileInfo.Length / 3 * 2; + offset[0] = 4 * 1024; + + byte[] bBuf = new byte[1024 * 4]; + + for (int i = 0; i < 4; ++i) + { + fs.Seek(offset[i], 0); + fs.Read(bBuf, 0, 4 * 1024); + + MD5 md5Hash = MD5.Create(); + byte[] data = md5Hash.ComputeHash(bBuf); + StringBuilder sBuilder = new StringBuilder(); + + for (int j = 0; j < data.Length; j++) + { + sBuilder.Append(data[j].ToString("x2")); + } + + if (!string.IsNullOrEmpty(ret)) + { + ret += ";"; + } + + ret += sBuilder.ToString(); + } + + fs.Close(); + + return ret; + } + #endregion + } +} diff --git a/Emby.MeiamSub.Shooter/Thumb.png b/Emby.MeiamSub.Shooter/Thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..34cbf7bcf9eeb37fd5d198458f6fed9acd187297 GIT binary patch literal 17825 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%0AJWU2CzJVsZ2`WwzLvwp5vZFQw_j?(gPp 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 literal 0 HcmV?d00001 diff --git a/Emby.MeiamSub.Thunder/Emby.MeiamSub.Thunder.csproj b/Emby.MeiamSub.Thunder/Emby.MeiamSub.Thunder.csproj index 8930e5d..272de35 100644 --- a/Emby.MeiamSub.Thunder/Emby.MeiamSub.Thunder.csproj +++ b/Emby.MeiamSub.Thunder/Emby.MeiamSub.Thunder.csproj @@ -1,5 +1,11 @@  + + 1.0.1.0 + 1.0.1.0 + 1.0.1 + + netcoreapp3.1 diff --git a/Emby.MeiamSub.Thunder/Plugin.cs b/Emby.MeiamSub.Thunder/Plugin.cs index 199461b..9e57a29 100644 --- a/Emby.MeiamSub.Thunder/Plugin.cs +++ b/Emby.MeiamSub.Thunder/Plugin.cs @@ -19,7 +19,7 @@ namespace Emby.MeiamSub.Thunder /// /// 插件名称 /// - public override string Name => "ThunderSubtitle"; + public override string Name => "MeiamSub.Thunder"; /// /// 插件描述 diff --git a/Emby.MeiamSub.Thunder/Thumb.png b/Emby.MeiamSub.Thunder/Thumb.png index 6911958f1b38d27b9e219319a284dbfe1070b6b8..28e08b3b12cf6c3166a45620599b23cf3a47aaca 100644 GIT binary patch literal 16907 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 literal 15465 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 0; - public string Name => "ThunderSubtitle"; + public string Name => "MeiamSub.Thunder"; /// /// 支持电影、剧集 @@ -60,7 +60,7 @@ namespace Emby.MeiamSub.Thunder /// public async Task> Search(SubtitleSearchRequest request, CancellationToken cancellationToken) { - _logger.Debug($"ThunderSubtitle Search | Request -> { _jsonSerializer.SerializeToString(request) }"); + _logger.Debug($"MeiamSub.Thunder Search | Request -> { _jsonSerializer.SerializeToString(request) }"); var subtitles = await SearchSubtitlesAsync(request); @@ -74,6 +74,11 @@ namespace Emby.MeiamSub.Thunder /// private async Task> SearchSubtitlesAsync(SubtitleSearchRequest request) { + if (request.Language != "chi") + { + return Array.Empty(); + } + var cid = GetCidByFile(request.MediaPath); var response = await _httpClient.GetResponse(new HttpRequestOptions @@ -81,7 +86,7 @@ namespace Emby.MeiamSub.Thunder Url = $"http://sub.xmp.sandai.net:8000/subxl/{cid}.json" }); - _logger.Debug($"ThunderSubtitle Search | Response -> { _jsonSerializer.SerializeToString(response) }"); + _logger.Debug($"MeiamSub.Thunder Search | Response -> { _jsonSerializer.SerializeToString(response) }"); if (response.StatusCode == HttpStatusCode.OK) { @@ -89,10 +94,14 @@ namespace Emby.MeiamSub.Thunder if (subtitleResponse != null) { + _logger.Debug($"MeiamSub.Thunder Search | Response -> { _jsonSerializer.SerializeToString(subtitleResponse) }"); + var subtitles = subtitleResponse.sublist.Where(m => !string.IsNullOrEmpty(m.sname)); if (subtitles.Count() > 0) { + _logger.Debug($"MeiamSub.Thunder Search | Summary -> Get { subtitles.Count() } Subtitles"); + return subtitles.Select(m => new RemoteSubtitleInfo() { Id = Base64Encode(_jsonSerializer.SerializeToString(new DownloadSubInfo @@ -103,22 +112,23 @@ namespace Emby.MeiamSub.Thunder TwoLetterISOLanguageName = request.TwoLetterISOLanguageName, IsForced = request.IsForced })), - Name = Path.GetFileName(HttpUtility.UrlDecode(m.sname)), + Name = $"[MEIAMSUB] { Path.GetFileName(request.MediaPath) } | {request.TwoLetterISOLanguageName} | 迅雷", Author = "Meiam ", CommunityRating = Convert.ToSingle(m.rate), - ProviderName = "ThunderSubtitle", + ProviderName = "MeiamSub.Thunder", Format = ExtractFormat(m.sname), - Comment = $"Rate : { m.rate }" + Comment = $"Format : { ExtractFormat(m.sname)} - Rate : { m.rate }" }).OrderByDescending(m => m.CommunityRating); } } } + _logger.Debug($"MeiamSub.Thunder Search | Summary -> Get 0 Subtitles"); + return Array.Empty(); } #endregion - #region 下载字幕 /// /// 下载请求 @@ -130,7 +140,7 @@ namespace Emby.MeiamSub.Thunder { await Task.Run(() => { - _logger.Debug($"ThunderSubtitle DownloadSub | Request -> {id}"); + _logger.Debug($"MeiamSub.Thunder DownloadSub | Request -> {id}"); }); return await DownloadSubAsync(id); @@ -145,14 +155,14 @@ namespace Emby.MeiamSub.Thunder { var downloadSub = _jsonSerializer.DeserializeFromString(Base64Decode(info)); - _logger.Debug($"ThunderSubtitle DownloadSub | Url -> { downloadSub.Url } | Format -> { downloadSub.Format } | Language -> { downloadSub.Language } "); + _logger.Debug($"MeiamSub.Thunder DownloadSub | Url -> { downloadSub.Url } | Format -> { downloadSub.Format } | Language -> { downloadSub.Language } "); var response = await _httpClient.GetResponse(new HttpRequestOptions { Url = downloadSub.Url }); - _logger.Debug($"ThunderSubtitle DownloadSub | Response -> { response.StatusCode }"); + _logger.Debug($"MeiamSub.Thunder DownloadSub | Response -> { response.StatusCode }"); if (response.StatusCode == HttpStatusCode.OK) { diff --git a/Emby.MeiamSub.sln b/Emby.MeiamSub.sln index 6b9bd85..9c28627 100644 --- a/Emby.MeiamSub.sln +++ b/Emby.MeiamSub.sln @@ -7,6 +7,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Emby.MeiamSub.Thunder", "Em EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Emby.MeiamSub.DevTool", "Emby.MeiamSub.DevTool\Emby.MeiamSub.DevTool.csproj", "{6B0C23EA-EC24-4FB0-948E-094E84AEBF21}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.MeiamSub.Shooter", "Emby.MeiamSub.Shooter\Emby.MeiamSub.Shooter.csproj", "{0F502AEB-0FF4-44FA-8391-13AD61FC5490}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -21,6 +23,10 @@ Global {6B0C23EA-EC24-4FB0-948E-094E84AEBF21}.Debug|Any CPU.Build.0 = Debug|Any CPU {6B0C23EA-EC24-4FB0-948E-094E84AEBF21}.Release|Any CPU.ActiveCfg = Release|Any CPU {6B0C23EA-EC24-4FB0-948E-094E84AEBF21}.Release|Any CPU.Build.0 = Release|Any CPU + {0F502AEB-0FF4-44FA-8391-13AD61FC5490}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0F502AEB-0FF4-44FA-8391-13AD61FC5490}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0F502AEB-0FF4-44FA-8391-13AD61FC5490}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0F502AEB-0FF4-44FA-8391-13AD61FC5490}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE