|
@@ -440,6 +440,187 @@ namespace OpenSubtitlesHandler
|
|
|
}
|
|
|
return new MethodResponseError("Fail", "Search Subtitles call failed !");
|
|
|
}
|
|
|
+
|
|
|
+ public static async Task<IMethodResponse> SearchSubtitlesAsync(SubtitleSearchParameters[] parameters, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ if (TOKEN == "")
|
|
|
+ {
|
|
|
+ OSHConsole.WriteLine("Can't do this call, 'token' value not set. Please use Log In method first.", DebugCode.Error);
|
|
|
+ return new MethodResponseError("Fail", "Can't do this call, 'token' value not set. Please use Log In method first.");
|
|
|
+ }
|
|
|
+ if (parameters == null)
|
|
|
+ {
|
|
|
+ OSHConsole.UpdateLine("No subtitle search parameter passed !!", DebugCode.Error);
|
|
|
+ return new MethodResponseError("Fail", "No subtitle search parameter passed"); ;
|
|
|
+ }
|
|
|
+ if (parameters.Length == 0)
|
|
|
+ {
|
|
|
+ OSHConsole.UpdateLine("No subtitle search parameter passed !!", DebugCode.Error);
|
|
|
+ return new MethodResponseError("Fail", "No subtitle search parameter passed"); ;
|
|
|
+ }
|
|
|
+ // Method call ..
|
|
|
+ List<IXmlRpcValue> parms = new List<IXmlRpcValue>();
|
|
|
+ // Add token param
|
|
|
+ parms.Add(new XmlRpcValueBasic(TOKEN, XmlRpcBasicValueType.String));
|
|
|
+ // Add subtitle search parameters. Each one will be like 'array' of structs.
|
|
|
+ XmlRpcValueArray array = new XmlRpcValueArray();
|
|
|
+ foreach (SubtitleSearchParameters param in parameters)
|
|
|
+ {
|
|
|
+ XmlRpcValueStruct strct = new XmlRpcValueStruct(new List<XmlRpcStructMember>());
|
|
|
+ // sublanguageid member
|
|
|
+ XmlRpcStructMember member = new XmlRpcStructMember("sublanguageid",
|
|
|
+ new XmlRpcValueBasic(param.SubLangaugeID, XmlRpcBasicValueType.String));
|
|
|
+ strct.Members.Add(member);
|
|
|
+ // moviehash member
|
|
|
+ if (param.MovieHash.Length > 0 && param.MovieByteSize > 0)
|
|
|
+ {
|
|
|
+ member = new XmlRpcStructMember("moviehash",
|
|
|
+ new XmlRpcValueBasic(param.MovieHash, XmlRpcBasicValueType.String));
|
|
|
+ strct.Members.Add(member);
|
|
|
+ // moviehash member
|
|
|
+ member = new XmlRpcStructMember("moviebytesize",
|
|
|
+ new XmlRpcValueBasic(param.MovieByteSize, XmlRpcBasicValueType.Int));
|
|
|
+ strct.Members.Add(member);
|
|
|
+ }
|
|
|
+ if (param.Query.Length > 0)
|
|
|
+ {
|
|
|
+ member = new XmlRpcStructMember("query",
|
|
|
+ new XmlRpcValueBasic(param.Query, XmlRpcBasicValueType.String));
|
|
|
+ strct.Members.Add(member);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (param.Episode.Length > 0 && param.Season.Length > 0)
|
|
|
+ {
|
|
|
+ member = new XmlRpcStructMember("season",
|
|
|
+ new XmlRpcValueBasic(param.Season, XmlRpcBasicValueType.String));
|
|
|
+ strct.Members.Add(member);
|
|
|
+ member = new XmlRpcStructMember("episode",
|
|
|
+ new XmlRpcValueBasic(param.Episode, XmlRpcBasicValueType.String));
|
|
|
+ strct.Members.Add(member);
|
|
|
+ }
|
|
|
+
|
|
|
+ // imdbid member
|
|
|
+ if (param.IMDbID.Length > 0)
|
|
|
+ {
|
|
|
+ member = new XmlRpcStructMember("imdbid",
|
|
|
+ new XmlRpcValueBasic(param.IMDbID, XmlRpcBasicValueType.String));
|
|
|
+ strct.Members.Add(member);
|
|
|
+ }
|
|
|
+ // Add the struct to the array
|
|
|
+ array.Values.Add(strct);
|
|
|
+ }
|
|
|
+ // Add the array to the parameters
|
|
|
+ parms.Add(array);
|
|
|
+ // Call !
|
|
|
+ XmlRpcMethodCall call = new XmlRpcMethodCall("SearchSubtitles", parms);
|
|
|
+ OSHConsole.WriteLine("Sending SearchSubtitles request to the server ...", DebugCode.Good);
|
|
|
+ // Send the request to the server
|
|
|
+ string response = Utilities.GetStreamString(await Utilities.SendRequestAsync(XmlRpcGenerator.Generate(call), XML_PRC_USERAGENT, cancellationToken).ConfigureAwait(false));
|
|
|
+
|
|
|
+ if (!response.Contains("ERROR:"))
|
|
|
+ {
|
|
|
+ // No error occur, get and decode the response.
|
|
|
+ XmlRpcMethodCall[] calls = XmlRpcGenerator.DecodeMethodResponse(response);
|
|
|
+ if (calls.Length > 0)
|
|
|
+ {
|
|
|
+ if (calls[0].Parameters.Count > 0)
|
|
|
+ {
|
|
|
+ // We expect Struct of 3 members:
|
|
|
+ //* the first is status
|
|
|
+ //* the second is [array of structs, each one includes subtitle file].
|
|
|
+ //* the third is [double basic value] represent seconds token by server.
|
|
|
+ XmlRpcValueStruct mainStruct = (XmlRpcValueStruct)calls[0].Parameters[0];
|
|
|
+ // Create the response, we'll need it later
|
|
|
+ MethodResponseSubtitleSearch R = new MethodResponseSubtitleSearch();
|
|
|
+ // To make sure response is not currepted by server, do it in loop
|
|
|
+ foreach (XmlRpcStructMember MEMBER in mainStruct.Members)
|
|
|
+ {
|
|
|
+ if (MEMBER.Name == "status")
|
|
|
+ {
|
|
|
+ R.Status = (string)MEMBER.Data.Data;
|
|
|
+ OSHConsole.WriteLine("Status= " + R.Status);
|
|
|
+ }
|
|
|
+ else if (MEMBER.Name == "seconds")
|
|
|
+ {
|
|
|
+ R.Seconds = (double)MEMBER.Data.Data;
|
|
|
+ OSHConsole.WriteLine("Seconds= " + R.Seconds);
|
|
|
+ }
|
|
|
+ else if (MEMBER.Name == "data")
|
|
|
+ {
|
|
|
+ if (MEMBER.Data is XmlRpcValueArray)
|
|
|
+ {
|
|
|
+ OSHConsole.WriteLine("Search results: ");
|
|
|
+
|
|
|
+ XmlRpcValueArray rarray = (XmlRpcValueArray)MEMBER.Data;
|
|
|
+ foreach (IXmlRpcValue subStruct in rarray.Values)
|
|
|
+ {
|
|
|
+ if (subStruct == null) continue;
|
|
|
+ if (!(subStruct is XmlRpcValueStruct)) continue;
|
|
|
+
|
|
|
+ SubtitleSearchResult result = new SubtitleSearchResult();
|
|
|
+ foreach (XmlRpcStructMember submember in ((XmlRpcValueStruct)subStruct).Members)
|
|
|
+ {
|
|
|
+ // To avoid errors of arranged info or missing ones, let's do it with switch..
|
|
|
+ switch (submember.Name)
|
|
|
+ {
|
|
|
+ case "IDMovie": result.IDMovie = submember.Data.Data.ToString(); break;
|
|
|
+ case "IDMovieImdb": result.IDMovieImdb = submember.Data.Data.ToString(); break;
|
|
|
+ case "IDSubMovieFile": result.IDSubMovieFile = submember.Data.Data.ToString(); break;
|
|
|
+ case "IDSubtitle": result.IDSubtitle = submember.Data.Data.ToString(); break;
|
|
|
+ case "IDSubtitleFile": result.IDSubtitleFile = submember.Data.Data.ToString(); break;
|
|
|
+ case "ISO639": result.ISO639 = submember.Data.Data.ToString(); break;
|
|
|
+ case "LanguageName": result.LanguageName = submember.Data.Data.ToString(); break;
|
|
|
+ case "MovieByteSize": result.MovieByteSize = submember.Data.Data.ToString(); break;
|
|
|
+ case "MovieHash": result.MovieHash = submember.Data.Data.ToString(); break;
|
|
|
+ case "MovieImdbRating": result.MovieImdbRating = submember.Data.Data.ToString(); break;
|
|
|
+ case "MovieName": result.MovieName = submember.Data.Data.ToString(); break;
|
|
|
+ case "MovieNameEng": result.MovieNameEng = submember.Data.Data.ToString(); break;
|
|
|
+ case "MovieReleaseName": result.MovieReleaseName = submember.Data.Data.ToString(); break;
|
|
|
+ case "MovieTimeMS": result.MovieTimeMS = submember.Data.Data.ToString(); break;
|
|
|
+ case "MovieYear": result.MovieYear = submember.Data.Data.ToString(); break;
|
|
|
+ case "SubActualCD": result.SubActualCD = submember.Data.Data.ToString(); break;
|
|
|
+ case "SubAddDate": result.SubAddDate = submember.Data.Data.ToString(); break;
|
|
|
+ case "SubAuthorComment": result.SubAuthorComment = submember.Data.Data.ToString(); break;
|
|
|
+ case "SubBad": result.SubBad = submember.Data.Data.ToString(); break;
|
|
|
+ case "SubDownloadLink": result.SubDownloadLink = submember.Data.Data.ToString(); break;
|
|
|
+ case "SubDownloadsCnt": result.SubDownloadsCnt = submember.Data.Data.ToString(); break;
|
|
|
+ case "SeriesEpisode": result.SeriesEpisode = submember.Data.Data.ToString(); break;
|
|
|
+ case "SeriesSeason": result.SeriesSeason = submember.Data.Data.ToString(); break;
|
|
|
+ case "SubFileName": result.SubFileName = submember.Data.Data.ToString(); break;
|
|
|
+ case "SubFormat": result.SubFormat = submember.Data.Data.ToString(); break;
|
|
|
+ case "SubHash": result.SubHash = submember.Data.Data.ToString(); break;
|
|
|
+ case "SubLanguageID": result.SubLanguageID = submember.Data.Data.ToString(); break;
|
|
|
+ case "SubRating": result.SubRating = submember.Data.Data.ToString(); break;
|
|
|
+ case "SubSize": result.SubSize = submember.Data.Data.ToString(); break;
|
|
|
+ case "SubSumCD": result.SubSumCD = submember.Data.Data.ToString(); break;
|
|
|
+ case "UserID": result.UserID = submember.Data.Data.ToString(); break;
|
|
|
+ case "UserNickName": result.UserNickName = submember.Data.Data.ToString(); break;
|
|
|
+ case "ZipDownloadLink": result.ZipDownloadLink = submember.Data.Data.ToString(); break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ R.Results.Add(result);
|
|
|
+ OSHConsole.WriteLine(">" + result.ToString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else// Unknown data ?
|
|
|
+ {
|
|
|
+ OSHConsole.WriteLine("Data= " + MEMBER.Data.Data.ToString(), DebugCode.Warning);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // Return the response to user !!
|
|
|
+ return R;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ OSHConsole.WriteLine(response, DebugCode.Error);
|
|
|
+ return new MethodResponseError("Fail", response);
|
|
|
+ }
|
|
|
+ return new MethodResponseError("Fail", "Search Subtitles call failed !");
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// Download subtitle file(s)
|
|
|
/// </summary>
|