Download main.py from zliang/doi2ref: direct link, hf CLI and curl.
- Browser
- Download file 3.04 kB
-
https://huggingface.co/spaces/zliang/doi2ref/resolve/main/main.py
- Command line
-
hf download hf://spaces/zliang/doi2ref/main.py
-
curl -L -o main.py https://huggingface.co/spaces/zliang/doi2ref/resolve/main/main.py
3.04 kB
| 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/' | |
| 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) | |
| 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") | |
| 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) |