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:
parent
3de87fc735
commit
8b483000e2
4 changed files with 45 additions and 38 deletions
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue