11using System ;
22using System . Collections . Generic ;
3+ using System . Diagnostics ;
34using System . Drawing ;
45using System . Json ;
56using System . Linq ;
67using System . Runtime . Serialization . Json ;
78using System . Text ;
9+ using System . Threading . Tasks ;
810using System . Xml ;
911using RestSharp ;
1012using SimpleCore . Utilities ;
@@ -82,7 +84,7 @@ private static ISearchResult[] ConvertResults(SauceNaoResult[] results)
8284 var rg = new List < ISearchResult > ( ) ;
8385
8486 foreach ( var sn in results ) {
85- if ( sn . Url != null ) {
87+ if ( sn . Url != null ) {
8688 var url = sn . Url . FirstOrDefault ( u => u != null ) ;
8789
8890 rg . Add ( new SauceNaoSimpleResult ( sn . WebsiteTitle , url , sn . Similarity ) ) ;
@@ -94,56 +96,74 @@ private static ISearchResult[] ConvertResults(SauceNaoResult[] results)
9496
9597 public override FullSearchResult GetResult ( string url )
9698 {
97- FullSearchResult result = base . GetResult ( url ) ;
99+ FullSearchResult result = base . GetResult ( url ) ;
98100
99101 try {
100- var sn = GetResults ( url )
102+ var orig = GetResults ( url ) ;
103+
104+ if ( orig == null ) {
105+ result . ExtendedInfo . Add ( $ "Timed out after { Timeout } ") ;
106+ return result ;
107+ }
108+
109+ var sn = orig
101110 . OrderByDescending ( r => r . Similarity )
102111 . ToArray ( ) ;
103112
104113 var extended = ConvertResults ( sn ) ;
105114
106115 var best = extended
107- . Where ( e=> e . Url != null )
108- . OrderByDescending ( e=> e . Similarity )
116+ . Where ( e => e . Url != null )
117+ . OrderByDescending ( e => e . Similarity )
109118 . First ( ) ;
110119
111- result . Url = best . Url ;
120+ result . Url = best . Url ;
112121 result . Similarity = best . Similarity ;
113- result . Caption = best . Caption ;
122+ result . Caption = best . Caption ;
114123
115124
116125 result . AddExtendedResults ( extended ) ;
117126
118127 if ( ! string . IsNullOrWhiteSpace ( m_apiKey ) ) {
119128 result . ExtendedInfo . Add ( "Using API" ) ;
120129 }
121-
130+
122131 }
123132 catch ( Exception e ) {
124-
133+
125134 result . ExtendedInfo . Add ( e . StackTrace ) ;
126135 }
127136
128137
129138 return result ;
130139 }
131140
132-
141+ /// <summary>
142+ /// Timeout duration
143+ /// </summary>
144+ public static readonly TimeSpan Timeout = TimeSpan . FromSeconds ( 15 ) ;
145+
133146 private IEnumerable < SauceNaoResult > ? GetResults ( string url )
134147 {
135- var req = new RestRequest ( ) ;
136- req . AddQueryParameter ( "db" , "999" ) ;
137- req . AddQueryParameter ( "output_type" , "2" ) ;
138- req . AddQueryParameter ( "numres" , "16" ) ;
139- req . AddQueryParameter ( "api_key" , m_apiKey ) ;
140- req . AddQueryParameter ( "url" , url ) ;
141148
142- var res = m_client . Execute ( req ) ;
149+ var task = Task . Run ( ( ) =>
150+ {
151+ var req = new RestRequest ( ) ;
152+ req . AddQueryParameter ( "db" , "999" ) ;
153+ req . AddQueryParameter ( "output_type" , "2" ) ;
154+ req . AddQueryParameter ( "numres" , "16" ) ;
155+ req . AddQueryParameter ( "api_key" , m_apiKey ) ;
156+ req . AddQueryParameter ( "url" , url ) ;
157+
158+ var res = m_client . Execute ( req ) ;
159+
160+ string c = res . Content ;
143161
144- string c = res . Content ;
162+ return ReadResults ( c ) ;
163+ } ) ;
145164
146- return ReadResults ( c ) ;
165+ // Handle possible timeouts
166+ return task . Wait ( Timeout ) ? task . Result : null ;
147167 }
148168
149169
@@ -159,12 +179,12 @@ public override FullSearchResult GetResult(string url)
159179 var jsonArray = jsonObject [ "results" ] ;
160180
161181 for ( int i = 0 ; i < jsonArray . Count ; i ++ ) {
162- var header = jsonArray [ i ] [ "header" ] ;
163- var data = jsonArray [ i ] [ "data" ] ;
164- string obj = header . ToString ( ) ;
165- obj = obj . Remove ( obj . Length - 1 ) ;
166- obj += data . ToString ( ) . Remove ( 0 , 1 ) . Insert ( 0 , "," ) ;
167- jsonArray [ i ] = JsonValue . Parse ( obj ) ;
182+ var header = jsonArray [ i ] [ "header" ] ;
183+ var data = jsonArray [ i ] [ "data" ] ;
184+ string obj = header . ToString ( ) ;
185+ obj = obj . Remove ( obj . Length - 1 ) ;
186+ obj += data . ToString ( ) . Remove ( 0 , 1 ) . Insert ( 0 , "," ) ;
187+ jsonArray [ i ] = JsonValue . Parse ( obj ) ;
168188 }
169189
170190 string json = jsonArray . ToString ( ) ;
@@ -174,7 +194,7 @@ public override FullSearchResult GetResult(string url)
174194 JsonReaderWriterFactory . CreateJsonReader ( Encoding . UTF8 . GetBytes ( json ) ,
175195 XmlDictionaryReaderQuotas . Max ) ;
176196 var serializer = new DataContractJsonSerializer ( typeof ( SauceNaoResponse ) ) ;
177- var result = serializer . ReadObject ( stream ) as SauceNaoResponse ;
197+ var result = serializer . ReadObject ( stream ) as SauceNaoResponse ;
178198 stream . Dispose ( ) ;
179199
180200 if ( result is null )
0 commit comments