1
0
Fork 0
mirror of https://github.com/Findus23/PaperLibrary-cli.git synced 2024-09-20 17:03:46 +02:00

support bibtex

This commit is contained in:
Lukas Winkler 2020-11-08 22:25:56 +01:00
parent 3de87fc735
commit 8b483000e2
Signed by: lukas
GPG key ID: 54DE4D798D244853
4 changed files with 45 additions and 38 deletions

View file

@ -36,6 +36,10 @@ class PaperLibraryAPI:
years[paper.year] = [paper] years[paper.year] = [paper]
return years return years
def fetch_bibliography(self) -> str:
r = self.s.get(self.baseURL + "bibtex/")
return r.text
def fetch_pdfs(self) -> List[PDF]: def fetch_pdfs(self) -> List[PDF]:
r = self.s.get(self.baseURL + "pdfs/") r = self.s.get(self.baseURL + "pdfs/")
return PDF.schema().loads(r.text, many=True) return PDF.schema().loads(r.text, many=True)

View file

@ -6,15 +6,6 @@ from dataclasses_json import DataClassJsonMixin, config
from marshmallow import fields from marshmallow import fields
@dataclass
class Note(DataClassJsonMixin):
paper: int
recommended_by: List[str]
custom_title: str
notes_md: str
notes_html: str
@dataclass @dataclass
class PDF(DataClassJsonMixin): class PDF(DataClassJsonMixin):
id: int id: int
@ -37,9 +28,9 @@ class Paper(DataClassJsonMixin):
# id: int # id: int
url: str url: str
title: str title: str
custom_title: str
pdfs: List[PDF] pdfs: List[PDF]
doi: Optional[str] doi: Optional[str]
note: Optional[Note]
@property @property
def main_pdf(self) -> Optional[PDF]: def main_pdf(self) -> Optional[PDF]:
@ -55,12 +46,18 @@ class PaperComplete(Paper):
first_author: str first_author: str
publication: str publication: str
doctype: str doctype: str
arxiv_id: str arxiv_id: Optional[str]
bibcode: str bibcode: str
year: int year: int
pubdate: str # TODO: to datetime pubdate: str # TODO: to datetime
entry_date: str # TODO: to datetime entry_date: str # TODO: to datetime
citation_count: int citation_count: int
citation_key: Optional[str]
recommended_by: List[str]
tags: List[str]
custom_title: str
notes_md: str
notes_html: str
@dataclass @dataclass

View file

@ -8,6 +8,7 @@ from alive_progress import alive_bar
from tzlocal import get_localzone from tzlocal import get_localzone
from paperlibrary.api import PaperLibraryAPI from paperlibrary.api import PaperLibraryAPI
from paperlibrary.api.models import Paper
from paperlibrary.config import basedir from paperlibrary.config import basedir
@ -20,6 +21,17 @@ def format_filename(s: str) -> str:
return filename return filename
def link_file(pdf_dir: Path, directory: Path, paper: Paper, filename: str = None) -> None:
if not paper.main_pdf:
return
if filename is None:
filename = paper.title
sourcefile = pdf_dir / f"{paper.main_pdf.id}.pdf"
targetfile = directory / "{}.pdf".format(format_filename(filename))
targetfile.symlink_to(sourcefile)
def write_symlinks(api: PaperLibraryAPI): def write_symlinks(api: PaperLibraryAPI):
... ...
pdf_dir = basedir / "pdfs" pdf_dir = basedir / "pdfs"
@ -30,8 +42,9 @@ def write_symlinks(api: PaperLibraryAPI):
year_dir = basedir / "by_year" year_dir = basedir / "by_year"
title_dir = basedir / "by_title" title_dir = basedir / "by_title"
custom_title_dir = basedir / "by_custom_title" custom_title_dir = basedir / "by_custom_title"
citation_key_dir = basedir / "by_citation_key"
for directory in [author_dir, keyword_dir, year_dir, title_dir, custom_title_dir]: for directory in [author_dir, keyword_dir, year_dir, title_dir, custom_title_dir, citation_key_dir]:
shutil.rmtree(directory, ignore_errors=True) shutil.rmtree(directory, ignore_errors=True)
directory.mkdir() directory.mkdir()
@ -39,45 +52,30 @@ def write_symlinks(api: PaperLibraryAPI):
author_subdir = author_dir / format_filename(author.display_name) author_subdir = author_dir / format_filename(author.display_name)
author_subdir.mkdir() author_subdir.mkdir()
for paper in author.papers: for paper in author.papers:
if not paper.main_pdf: link_file(pdf_dir, author_subdir, paper)
continue
sourcefile = pdf_dir / f"{paper.main_pdf.id}.pdf"
targetfile = author_subdir / "{}.pdf".format(format_filename(paper.title))
targetfile.symlink_to(sourcefile)
for keyword in api.fetch_keywords(): for keyword in api.fetch_keywords():
keyword_subdir = keyword_dir / format_filename(keyword.name) keyword_subdir = keyword_dir / format_filename(keyword.name)
keyword_subdir.mkdir() keyword_subdir.mkdir()
for paper in keyword.papers: for paper in keyword.papers:
if not paper.main_pdf: link_file(pdf_dir, keyword_subdir, paper)
continue
sourcefile = pdf_dir / f"{paper.main_pdf.id}.pdf"
targetfile = keyword_subdir / "{}.pdf".format(format_filename(paper.title))
targetfile.symlink_to(sourcefile)
for paper in api.fetch_papers(): for paper in api.fetch_papers():
if not paper.main_pdf: link_file(pdf_dir, title_dir, paper, paper.title)
continue
sourcefile = pdf_dir / f"{paper.main_pdf.id}.pdf" if not paper.custom_title:
targetfile = title_dir / "{}.pdf".format(format_filename(paper.title))
targetfile.symlink_to(sourcefile)
if not paper.note:
continue continue
sourcefile = pdf_dir / f"{paper.main_pdf.id}.pdf" link_file(pdf_dir, custom_title_dir, paper, paper.custom_title)
targetfile = custom_title_dir / "{}.pdf".format(format_filename(paper.note.custom_title))
targetfile.symlink_to(sourcefile) if not paper.custom_title:
continue
link_file(pdf_dir, citation_key_dir, paper, paper.citation_key)
for year, papers in api.fetch_papers_by_year().items(): for year, papers in api.fetch_papers_by_year().items():
year_subdir = year_dir / str(year) year_subdir = year_dir / str(year)
year_subdir.mkdir() year_subdir.mkdir()
for paper in papers: for paper in papers:
if not paper.main_pdf: link_file(pdf_dir, year_subdir, paper)
continue
sourcefile = pdf_dir / f"{paper.main_pdf.id}.pdf"
targetfile = year_subdir / "{}.pdf".format(format_filename(paper.title))
targetfile.symlink_to(sourcefile)
def download_file(api: PaperLibraryAPI, url: str, target_file: Path): def download_file(api: PaperLibraryAPI, url: str, target_file: Path):
@ -122,3 +120,10 @@ def update_pdfs(api: PaperLibraryAPI):
else: else:
print("remote file is newer") print("remote file is newer")
download_file(api, pdf.file, pdf_file) download_file(api, pdf.file, pdf_file)
def write_bibliography(api: PaperLibraryAPI):
bib = api.fetch_bibliography()
target_file = basedir / "bibliography.bib"
with target_file.open("w") as f:
f.write(bib)

View file

@ -2,7 +2,7 @@ import click
from paperlibrary.api import PaperLibraryAPI from paperlibrary.api import PaperLibraryAPI
from paperlibrary.config import url, auth_token from paperlibrary.config import url, auth_token
from paperlibrary.library import write_symlinks, update_pdfs from paperlibrary.library import write_symlinks, update_pdfs, write_bibliography
@click.group() @click.group()
@ -13,6 +13,7 @@ def cli():
@cli.command() @cli.command()
def update(): def update():
api = PaperLibraryAPI(url, auth_token=auth_token) api = PaperLibraryAPI(url, auth_token=auth_token)
write_bibliography(api)
write_symlinks(api) write_symlinks(api)
update_pdfs(api) update_pdfs(api)