89def response(resp: "SXNG_Response") -> EngineResults:
90
91 res = EngineResults()
92 json_data = resp.json()
93
94 for result in json_data.get("results", []):
95
96 if not result.get("title"):
97 continue
98
99
100 url: str | None = None
101
102
103 doi: str = result.get("doi")
104 if doi:
105 url = f"https://doi.org/{doi}"
106
107 if url is None and result.get("doi"):
108
109 url = "https://doi.org/" + str(result["doi"])
110 elif result.get("id"):
111 url = "https://core.ac.uk/works/" + str(result["id"])
112 elif result.get("downloadUrl"):
113 url = result["downloadUrl"]
114 elif result.get("sourceFulltextUrls"):
115 url = result["sourceFulltextUrls"]
116 else:
117 continue
118
119
120 published_date = None
121
122 raw_date = result.get("publishedDate") or result.get("depositedDate")
123 if raw_date:
124 try:
125 published_date = datetime.fromisoformat(result["publishedDate"].replace("Z", "+00:00"))
126 except (ValueError, AttributeError):
127 pass
128
129
130 journals = []
131 if result.get("journals"):
132 journals = [j.get("title") for j in result["journals"] if j.get("title")]
133
134
135 publisher = result.get("publisher", "").strip("'")
136
137
138 authors: set[str] = set()
139 for i in result.get("authors", []):
140 name: str | None = i.get("name")
141 if name:
142 authors.add(name)
143
144 res.add(
145 res.types.Paper(
146 title=result.get("title"),
147 url=url,
148 content=result.get("fullText", "") or "",
149 tags=result.get("fieldOfStudy", []),
150 publishedDate=published_date,
151 type=result.get("documentType", "") or "",
152 authors=authors,
153 editor=", ".join(result.get("contributors", [])),
154 publisher=publisher,
155 journal=", ".join(journals),
156 doi=result.get("doi"),
157 pdf_url=result.get("downloadUrl", {}) or result.get("sourceFulltextUrls", {}),
158 )
159 )
160
161 return res