Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        // 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[]>());
        }