@@ -97,7 +97,7 @@ public static int ParseContinuationParameters(JsonNode jresult, IDictionary<stri
9797 return null ;
9898 }
9999
100- #region Page/Revision query
100+ #region Page/Revision query
101101
102102 public static async IAsyncEnumerable < JsonObject > QueryWithContinuation ( WikiSite site ,
103103 IEnumerable < KeyValuePair < string , object ? > > parameters ,
@@ -178,6 +178,13 @@ public static async Task RefreshPagesAsync(IEnumerable<WikiPage> pages, IWikiPag
178178 var site = sitePages . Key . Site ;
179179 var queryParams = options . EnumParameters ( site . SiteInfo . Version ) . ToDictionary ( ) ;
180180 var titleLimit = options . GetMaxPaginationSize ( site . SiteInfo . Version , site . AccountInfo . HasRight ( UserRights . ApiHighLimits ) ) ;
181+ // Workaround https://github.com/CXuesong/WikiClientLibrary/issues/118
182+ // Currently, `prop=revisions` itself does not trigger continuation unless `rvlimit` has been specified. Good.
183+ // However, `prop=imageinfo` insists it return all the items eventually
184+ // meaning it will trigger continuation even if WCL consumer is only refreshing 1 page and
185+ // might only be interested in the latest n versions.
186+ var needPropImageInfoContinueHack = queryParams . GetValueOrDefault ( "prop" ) ? . ToString ( )
187+ ? . Contains ( "imageinfo" , StringComparison . Ordinal ) ?? false ;
181188 using ( site . BeginActionScope ( sitePages , options ) )
182189 {
183190 foreach ( var partition in sitePages . Partition ( titleLimit ) )
@@ -208,6 +215,20 @@ public static async Task RefreshPagesAsync(IEnumerable<WikiPage> pages, IWikiPag
208215 ParseContinuationParameters ( jobj1 , queryParams1 , continuationParams ) ;
209216 while ( continuationStatus != CONTINUATION_DONE )
210217 {
218+ if ( needPropImageInfoContinueHack
219+ && partition . Count == 1
220+ && continuationParams . ContainsKey ( "iistart" ) )
221+ {
222+ var continueValue = continuationParams . GetValueOrDefault ( "continue" ) ;
223+ if ( continueValue != null && ! continueValue . Contains ( "imageinfo" , StringComparison . Ordinal ) )
224+ {
225+ // Workaround https://github.com/CXuesong/WikiClientLibrary/issues/118
226+ // Fiddle with `continue` so it won't return old file revisions.
227+ continuationParams [ "continue" ] = string . IsNullOrEmpty ( continueValue )
228+ ? "||imageinfo"
229+ : continueValue + "|imageinfo" ;
230+ }
231+ }
211232 if ( continuationStatus == CONTINUATION_LOOP )
212233 throw new UnexpectedContinuationLoopException ( ) ;
213234 Debug . Assert ( continuationStatus == CONTINUATION_AVAILABLE ) ;
@@ -323,7 +344,7 @@ public static async Task RefreshPagesAsync(IEnumerable<WikiPage> pages, IWikiPag
323344 }
324345 }
325346
326- #endregion
347+ #endregion
327348
328349 /// <summary>
329350 /// Asynchronously purges the pages.
@@ -408,7 +429,10 @@ public static async Task PatrolAsync(WikiSite site, long? recentChangeId, long?
408429 {
409430 var jresult = await site . InvokeMediaWikiApiAsync ( new MediaWikiFormRequestMessage ( new
410431 {
411- action = "patrol" , rcid = recentChangeId , revid = revisionId , token = WikiSiteToken . Patrol ,
432+ action = "patrol" ,
433+ rcid = recentChangeId ,
434+ revid = revisionId ,
435+ token = WikiSiteToken . Patrol ,
412436 } ) , cancellationToken ) ;
413437 if ( recentChangeId != null ) Debug . Assert ( ( int ) jresult [ "patrol" ] [ "rcid" ] == recentChangeId . Value ) ;
414438 }
0 commit comments