diff --git a/fiduswriter/citation_api_import/static/js/modules/citation_api_import/crossref.js b/fiduswriter/citation_api_import/static/js/modules/citation_api_import/crossref.js index a953618..da3e962 100644 --- a/fiduswriter/citation_api_import/static/js/modules/citation_api_import/crossref.js +++ b/fiduswriter/citation_api_import/static/js/modules/citation_api_import/crossref.js @@ -16,20 +16,20 @@ export class CrossrefSearcher { } lookup(searchTerm) { - return fetch(`https://search.crossref.org/dois?q=${encodeURIComponent(escape(searchTerm))}`, { + return fetch(`/api/citation_api_import/proxy/https://api.crossref.org/v1/works?query.bibliographic=${encodeURIComponent(escape(searchTerm))}&rows=5&select=DOI,ISBN,title,author,published,abstract`, { method: "GET", }).then( response => response.json() - ).then(items => { + ).then(json => { const searchEl = document.getElementById("bibimport-search-result-crossref") if (!searchEl) { // window was closed before result was ready. return } - if (items.length) { - searchEl.innerHTML = searchApiResultCrossrefTemplate({items}) - } else { + if (json.status !== "ok" || !json.message.items) { searchEl.innerHTML = "" + } else { + searchEl.innerHTML = searchApiResultCrossrefTemplate({items: json.message.items}) } this.bind() }) @@ -37,7 +37,7 @@ export class CrossrefSearcher { getBibtex(doi) { this.importer.dialog.close() - fetch(`https://api.crossref.org/v1/works/${doi}/transform`, { + fetch(`/api/citation_api_import/proxy/https://api.crossref.org/v1/works/${encodeURIComponent(doi)}/transform`, { method: "GET", headers: { "Accept": "application/x-bibtex" diff --git a/fiduswriter/citation_api_import/static/js/modules/citation_api_import/pubmed.js b/fiduswriter/citation_api_import/static/js/modules/citation_api_import/pubmed.js index a42f652..097c08d 100644 --- a/fiduswriter/citation_api_import/static/js/modules/citation_api_import/pubmed.js +++ b/fiduswriter/citation_api_import/static/js/modules/citation_api_import/pubmed.js @@ -18,8 +18,7 @@ export class PubmedSearcher { } lookup(searchTerm) { - - return get("/api/citation_api_import/https://www.bioinformatics.org/texmed/cgi-bin/query.cgi", {query: escape(searchTerm)}).then( + return get("/api/citation_api_import/proxy/https://www.bioinformatics.org/texmed/cgi-bin/query.cgi", {query: escape(searchTerm)}).then( response => response.text() ).then( html => { diff --git a/fiduswriter/citation_api_import/static/js/modules/citation_api_import/templates.js b/fiduswriter/citation_api_import/static/js/modules/citation_api_import/templates.js index 0ce54d8..c6b4d8e 100644 --- a/fiduswriter/citation_api_import/static/js/modules/citation_api_import/templates.js +++ b/fiduswriter/citation_api_import/static/js/modules/citation_api_import/templates.js @@ -176,43 +176,41 @@ export const searchApiResultCrossrefTemplate = ({items}) => { return "

Crossref

" + ` - + - + ` + - items.map(item => - ` + items.map(item => { + const publishedDate = item.published && item.published['date-parts'] ? item.published['date-parts'].map(part => part.join("-")).join(", ") : "" + const abstractWithoutHTML = item.abstract ? item.abstract.replace(/<[^>]*>?/gm, '') : "" + return `` - ).join("") + "
${gettext("Title/Year")}${gettext("Title/Published")} ${gettext("DOI")}${gettext("Description")}${gettext("Abstract")}

- ${ - item.fullCitation ? - item.fullCitation : - `${item.title} ${item.year}` -} + ${item.title} ${publishedDate}

${ - item.doi ? - `

${item.doi}

` : + item.DOI ? + `

${item.DOI}

` : "" }
${ - item.description ? + abstractWithoutHTML.length ? `

${ - item.description.length < 200 ? - escapeText(item.description) : - escapeText(item.description.substring(0, 200)) + "..." + abstractWithoutHTML.length < 200 ? + escapeText(abstractWithoutHTML) : + escapeText(abstractWithoutHTML.substring(0, 200)) + "..." }

` : "" }
" + }).join("") + "" } diff --git a/fiduswriter/citation_api_import/views.py b/fiduswriter/citation_api_import/views.py index 00c3ced..3946bee 100644 --- a/fiduswriter/citation_api_import/views.py +++ b/fiduswriter/citation_api_import/views.py @@ -4,11 +4,13 @@ from django.views.decorators.http import require_GET from django.http import HttpResponseForbidden from django.http import HttpResponse +from django.conf import settings ALLOWED_DOMAINS = { "search.gesis.org": True, "api.datacite.org": True, "www.bioinformatics.org": True, + "api.crossref.org": True, } @@ -21,11 +23,22 @@ async def proxy(request, url): if domain not in ALLOWED_DOMAINS: return HttpResponseForbidden() query_string = request.META["QUERY_STRING"] + if domain == "api.crossref.org": + mailto = f"mailto={settings.CONTACT_EMAIL}" + if len(query_string): + query_string += "&" + mailto + else: + query_string = mailto if len(query_string): url = f"{url}?{query_string}" async with AsyncClient() as client: response = await client.get( url, + headers={ + "User-Agent": request.META.get("HTTP_USER_AGENT", "Fidus Writer"), + "Referer": request.META.get("HTTP_REFERER", ""), + "Accept": request.META.get("HTTP_ACCEPT", "application/json"), + }, timeout=88, # Firefox times out after 90 seconds, so we need to return before that. ) return HttpResponse(response.text, status=response.status_code)