doi2ref / main.py
zliang's picture
Update main.py
588e8ae verified
from fastapi import FastAPI, HTTPException
import urllib.request
from urllib.error import HTTPError
from habanero import Crossref
from fastapi.responses import HTMLResponse
app = FastAPI()
BASE_URL = 'https://doi.org/'
@app.get("/", response_class=HTMLResponse)
def read_root():
html_content = """
<html>
<head>
<title>Citation Helper</title>
</head>
<body>
<h1>Hello!</h1>
<p>As Citation Helper, I specialize in generating citations for academic papers. You can provide me with the DOI (Digital Object Identifier) or the title of an academic paper, and I will create a citation for it.</p>
<p>Here's how you can use my service:</p>
<ul>
<li><b>Provide a DOI or Title:</b> Share the DOI or the title of the paper you need a citation for.</li>
<li><b>Choose a Citation Style:</b> After I generate the citation in APA format, you can request it in another style like Chicago, MLA, or Harvard if needed.</li>
<li><b>Receive Your Citation:</b> I'll provide you with the correctly formatted citation.</li>
</ul>
<p>Feel free to start by giving me a DOI or a paper title!</p>
</body>
</html>
"""
return HTMLResponse(content=html_content)
@app.get("/title2ref/")
async def title2doi(title: str):
cr = Crossref()
result = cr.works(query=title)
# Check if the result has items and the title matches
if result['message']['items']:
for item in result['message']['items']:
if 'title' in item and item['title'][0] == title:
doi = item['DOI']
url = BASE_URL + doi
req = urllib.request.Request(url)
req.add_header('Accept', 'application/x-bibtex')
try:
with urllib.request.urlopen(req) as f:
bibtex = f.read().decode()
return {"bibtex": bibtex}
except HTTPError as e:
if e.code == 404:
raise HTTPException(status_code=404, detail="DOI not found")
else:
raise HTTPException(status_code=503, detail="Service unavailable")
# If no matching title found
raise HTTPException(status_code=404, detail="Title not found, please enter DOI")
@app.get("/doi2ref/")
async def doi2ref(doi: str):
url = BASE_URL + doi
req = urllib.request.Request(url)
req.add_header('Accept', 'application/x-bibtex')
try:
with urllib.request.urlopen(req) as f:
bibtex = f.read().decode()
return {"bibtex": bibtex}
except HTTPError as e:
if e.code == 404:
raise HTTPException(status_code=404, detail="DOI not found")
else:
raise HTTPException(status_code=503, detail="Service unavailable")
if __name__ == "__main__":
import uvicorn
uvicorn.run("main:app", host="0.0.0.0", port=7860)