private async Task <CrunchySubtitleInfo> GetSubtitle(CrunchySession token, int subid) { Dictionary <string, string> form = new Dictionary <string, string>(); form.Add("req", "RpcApiSubtitle_GetXml"); form.Add("subtitle_script_id", subid.ToString()); WebStream ws = await WebStream.Post("http://www.crunchyroll.com/xml/", form, null, LibSet[UserAgentS], null, token.cookies.ToCookieCollection(), SocketTimeout, true, "http://www.crunchyroll.com/swf/StandardVideoPlayer.swf", _info.ProxyFromGlobalRequirements(_global)); string dta = null; if (ws.StatusCode == HttpStatusCode.OK) { XmlSerializer ser = new XmlSerializer(typeof(Subtitle)); Subtitle s = (Subtitle)ser.Deserialize(ws); CrunchySubtitleInfo si = new CrunchySubtitleInfo(); DecodeSubtitle(int.Parse(s.Id), s.Iv, s.Data, ref si); si.Language = ADBaseLibrary.Subtitles.Languages.CodeFromOriginalLanguage(si.Title); ws.Dispose(); return(si); } ws?.Dispose(); return(null); }
private async Task<CrunchySubtitleInfo> GetSubtitle(CrunchySession token, int subid) { Dictionary<string, string> form = new Dictionary<string, string>(); form.Add("req", "RpcApiSubtitle_GetXml"); form.Add("subtitle_script_id", subid.ToString()); WebStream ws = await WebStream.Post("http://www.crunchyroll.com/xml/", form, null, LibSet[UserAgentS], null, token.cookies.ToCookieCollection(), SocketTimeout,true,"http://www.crunchyroll.com/swf/StandardVideoPlayer.swf", _info.ProxyFromGlobalRequirements(_global)); string dta = null; if (ws.StatusCode == HttpStatusCode.OK) { XmlSerializer ser = new XmlSerializer(typeof(Subtitle)); Subtitle s = (Subtitle)ser.Deserialize(ws); CrunchySubtitleInfo si = new CrunchySubtitleInfo(); DecodeSubtitle(int.Parse(s.Id), s.Iv, s.Data, ref si); si.Language = ADBaseLibrary.Subtitles.Languages.CodeFromOriginalLanguage(si.Title); ws.Dispose(); return si; } ws?.Dispose(); return null; }
private void DecodeSubtitle(int subtitleId, string ivBase64, string dataBase64, ref CrunchySubtitleInfo si) { byte[] key = GenerateKey(subtitleId).Concat(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }).ToArray(); byte[] iv = Convert.FromBase64String(ivBase64); byte[] data = Convert.FromBase64String(dataBase64); AesManaged mng = new AesManaged(); mng.Mode = CipherMode.CBC; mng.Padding = PaddingMode.None; ICryptoTransform tr = mng.CreateDecryptor(key, iv); byte[] kk = tr.TransformFinalBlock(data, 0, data.Length); MemoryStream ms = new MemoryStream(); ZlibStream stream = new ZlibStream(new MemoryStream(kk), Ionic.Zlib.CompressionMode.Decompress); stream.CopyTo(ms); ms.Position = 0; XmlSerializer serializer = new XmlSerializer(typeof(SubtitleScript)); SubtitleScript script = (SubtitleScript)serializer.Deserialize(ms); si.Title = script.Title; si.Ass = script.ToAss(); }