getbib / app.py
kiyer's picture
add basic functionality
c5e90ff verified
import gradio as gr
import urllib.request
from bs4 import BeautifulSoup
import re
def get_citation(bibcode):
"""Fetch citation from ADS bibcode"""
bibtex_url = f'https://ui.adsabs.harvard.edu/abs/{bibcode}/exportcitation'
with urllib.request.urlopen(bibtex_url) as response:
bibtex = response.read().decode('utf-8')
soup = BeautifulSoup(bibtex, 'html.parser')
citation_text = soup.textarea.text
return citation_text
def process_bibcodes(bibcode_input):
"""Process single or multiple bibcodes and generate .bib file"""
# Split input by newlines, commas, or spaces and clean up
bibcodes = re.split(r'[,\n\s]+', bibcode_input.strip())
bibcodes = [b.strip() for b in bibcodes if b.strip()]
if not bibcodes:
return "Error: No bibcodes provided", None
all_citations = []
errors = []
for bibcode in bibcodes:
try:
citation = get_citation(bibcode)
all_citations.append(citation)
except Exception as e:
errors.append(f"Error fetching {bibcode}: {str(e)}")
if not all_citations:
return "Error: Could not fetch any citations\n" + "\n".join(errors), None
# Combine all citations
combined_bib = "\n\n".join(all_citations)
# Create status message
status = f"Successfully fetched {len(all_citations)} citation(s)"
if errors:
status += "\n\nErrors:\n" + "\n".join(errors)
# Save to file
output_filename = "citations.bib"
with open(output_filename, 'w', encoding='utf-8') as f:
f.write(combined_bib)
return status, output_filename
# Create Gradio interface
with gr.Blocks(title="ADS BibTeX Citation Generator") as demo:
gr.Markdown("# ADS BibTeX Citation Generator")
gr.Markdown("Enter one or multiple ADS bibcodes to generate a .bib file. Separate multiple bibcodes with commas, spaces, or newlines.")
with gr.Row():
with gr.Column():
bibcode_input = gr.Textbox(
label="Bibcode(s)",
placeholder="e.g., 2021Natur.592..534C\nor multiple:\n2021Natur.592..534C, 1999AJ....118.2751M",
lines=5
)
submit_btn = gr.Button("Generate .bib File", variant="primary")
with gr.Column():
status_output = gr.Textbox(label="Status", lines=5)
file_output = gr.File(label="Download .bib File")
# Examples
gr.Examples(
examples=[
["2021Natur.592..534C"],
["2021Natur.592..534C\n1999AJ....118.2751M"],
["2021Natur.592..534C, 1999AJ....118.2751M, 2019ApJ...887..235P"]
],
inputs=bibcode_input
)
submit_btn.click(
fn=process_bibcodes,
inputs=bibcode_input,
outputs=[status_output, file_output]
)
# Launch the app
if __name__ == "__main__":
demo.launch()