private static XmlRpcObject ParseMethodResponse(XElement doc) { var values = doc.Element("params"); if (values == null) { throw new Exception("Xmlrpc response is invalid, missing params element."); } var resultObject = new XmlRpcObject(); var parameters = values.Elements("param"); foreach (var param in parameters) { var result = ParseParam(param); resultObject.Add(result); } return(resultObject); }
// see http://trac.opensubtitles.org/projects/opensubtitles/wiki/XmlRpcSearchSubtitles private async Task <Subtitle[]> SearchSubtitleAsync(string name) { var languageList = string.Join(",", supportedLanguages.Select(x => x.LanguageId).ToArray()); // TODO: its preferred to do a search with hash rather than filename // for later, we could try use search with hash first and then do a query search // if no results were given in the first search. // var movieHash = CalculateVideoHash(name); // var movieByteSize = GetVideoByteSize(name); var query = Path.GetFileName(name); var season = ""; var episode = ""; var seasonNumber = 0; var episodeNumber = 0; var isTvShowEpisode = false; var regex = new Regex(@"([s](?<season>\d+)[e](?<episode>\d+))|((?<episode>\d+)[s](?<season>\d+)) |((?<season>\d+)[e](?<episode>\d+))|([s](?<season>\d+))|(ep(?<episode>\d+)) |(season.(?<season>\d+))|(episode.(?<episode>\d+))|(e(?<episode>\d+))", RegexOptions.IgnoreCase); foreach (Match m in regex.Matches(query)) { var episodeGroup = m.Groups["episode"]; if (episodeGroup.Success && string.IsNullOrEmpty(episode)) { var item = episodeGroup.Captures[0]; if (item != null && !string.IsNullOrEmpty(item.Value)) { episode = item.Value; } } var seasonGroup = m.Groups["season"]; if (seasonGroup.Success && string.IsNullOrEmpty(season)) { var item = seasonGroup.Captures[0]; if (item != null && !string.IsNullOrEmpty(item.Value)) { season = item.Value; } } if (!string.IsNullOrEmpty(episode) && !string.IsNullOrEmpty(season)) { isTvShowEpisode = true; int.TryParse(episode, out episodeNumber); int.TryParse(season, out seasonNumber); break; } } XmlRpcObject requestResult = null; if (isTvShowEpisode) { query = regex.Replace(query, ""); requestResult = await ApiRequest("SearchSubtitles", Arg("query", query), Arg("sublanguageid", languageList), Arg("seriesepisode", episodeNumber), Arg("Seriesseason", seasonNumber)); } else { requestResult = await ApiRequest("SearchSubtitles", Arg("query", query), Arg("sublanguageid", languageList)); } return(requestResult.Deserialize <Subtitle[]>()); }