@@ -110,6 +110,23 @@ def make_url_params( # noqa: PLR0911
110
110
raise NotImplementedError
111
111
112
112
113
+ @retry (
114
+ retry = retry_if_exception (make_flaky_ssl_error_predicate (SEMANTIC_SCHOLAR_HOST )),
115
+ before_sleep = before_sleep_log (logger , logging .WARNING ),
116
+ stop = stop_after_attempt (3 ),
117
+ )
118
+ async def _s2_get_with_retrying (url : str , ** get_kwargs ) -> dict [str , Any ]:
119
+ return await _get_with_retrying (
120
+ url = url ,
121
+ headers = get_kwargs .get ("headers" ) or semantic_scholar_headers (),
122
+ timeout = (
123
+ get_kwargs .get ("timeout" )
124
+ or aiohttp .ClientTimeout (SEMANTIC_SCHOLAR_API_REQUEST_TIMEOUT )
125
+ ),
126
+ ** get_kwargs ,
127
+ )
128
+
129
+
113
130
def s2_authors_match (authors : list [str ], data : dict ) -> bool :
114
131
"""Check if the authors in the data match the authors in the paper."""
115
132
AUTHOR_NAME_MIN_LENGTH = 2
@@ -131,7 +148,7 @@ def s2_authors_match(authors: list[str], data: dict) -> bool:
131
148
132
149
133
150
async def parse_s2_to_doc_details (
134
- paper_data : dict , session : aiohttp .ClientSession
151
+ paper_data : dict [ str , Any ] , session : aiohttp .ClientSession
135
152
) -> DocDetails :
136
153
137
154
bibtex_source = "self_generated"
@@ -217,12 +234,10 @@ async def s2_title_search(
217
234
params = {"query" : title , "fields" : fields }
218
235
)
219
236
220
- data = await _get_with_retrying (
237
+ data = await _s2_get_with_retrying (
221
238
url = endpoint ,
222
239
params = params ,
223
240
session = session ,
224
- headers = semantic_scholar_headers (),
225
- timeout = SEMANTIC_SCHOLAR_API_REQUEST_TIMEOUT ,
226
241
http_exception_mappings = {
227
242
HTTPStatus .NOT_FOUND : DOINotFoundError (f"Could not find DOI for { title } ." )
228
243
},
@@ -277,19 +292,18 @@ async def get_s2_doc_details_from_doi(
277
292
else :
278
293
s2_fields = SEMANTIC_SCHOLAR_API_FIELDS
279
294
280
- details = await _get_with_retrying (
281
- url = f"{ SEMANTIC_SCHOLAR_BASE_URL } /graph/v1/paper/DOI:{ doi } " ,
282
- params = {"fields" : s2_fields },
295
+ return await parse_s2_to_doc_details (
296
+ paper_data = await _s2_get_with_retrying (
297
+ url = f"{ SEMANTIC_SCHOLAR_BASE_URL } /graph/v1/paper/DOI:{ doi } " ,
298
+ params = {"fields" : s2_fields },
299
+ session = session ,
300
+ http_exception_mappings = {
301
+ HTTPStatus .NOT_FOUND : DOINotFoundError (f"Could not find DOI for { doi } ." )
302
+ },
303
+ ),
283
304
session = session ,
284
- headers = semantic_scholar_headers (),
285
- timeout = SEMANTIC_SCHOLAR_API_REQUEST_TIMEOUT ,
286
- http_exception_mappings = {
287
- HTTPStatus .NOT_FOUND : DOINotFoundError (f"Could not find DOI for { doi } ." )
288
- },
289
305
)
290
306
291
- return await parse_s2_to_doc_details (details , session )
292
-
293
307
294
308
async def get_s2_doc_details_from_title (
295
309
title : str | None ,
0 commit comments