Files
conjurer/conjurer_librarian/conjurer_librarian.py
T
2024-04-01 13:11:33 +02:00

89 lines
3.2 KiB
Python

import re
import netrc
import json
from platform import uname
from sys import platform
from urllib.request import urlopen
from habanero import Crossref
if platform in ("linux", "linux2"):
SEPARATOR_FILE_PATH = "/"
if "microsoft-standard" in uname().release:
NETRC_FILE = "/home/mtuszowski/.netrc"
else:
NETRC_FILE = "/home/pi/.netrc"
elif platform == "win32":
NETRC_FILE = "C:\\Users\\mtusz\\.netrc"
class Librarian(object):
def __init__(self) -> None:
netrc_mod = netrc.netrc(NETRC_FILE)
authTokens = netrc_mod.authenticators("crossref")
self.cr = Crossref(mailto=authTokens[0])
self.last_search = ""
self.limit = 1000
def search_crossref(self, query):
self.last_search = self.cr.works(query = query, limit = self.limit)
for item in self.last_search['message']['items']:
print("=====")
#print (item)
print(item['DOI'])
print(item['title'])
print(item['type'])
print("=====")
if "container-title" in item:
print("This a part of larger release")
print(item['container-title'])
print (self.last_search['message']['total-results'])
with open("results.json", "x", encoding="UTF-8") as new_file:
new_file.seek(0)
json.dump(self.last_search['message']['items'], new_file, indent=4)
def check_if_exists(self,page_url):
in_scihub_db = True
if not page_url.startswith(("http:", "https:")):
raise ValueError("URL must start with 'http:' or 'https:'")
# trunk-ignore(bandit/B310)
with urlopen(page_url) as response:
info = response.info()
print(info.get_content_type())
data = response.read()
text = data.decode("utf-8")
for line in text.splitlines():
if re.match(r".*Unfortunately, Sci-Hub doesn't have the requested document.*", line):
return None
if in_scihub_db:
return text
return None
def download(self, page_url):
if response := self.check_if_exists(page_url):
for line in response.splitlines():
if m := re.match(r".*<embed type=\"application.pdf\"\s*src=\"(.*\.pdf)",line):
return "https:" + str(m.group(1))
return None
def provide_sci_hub_link(self, page_url):
if self.check_if_exists(page_url):
return page_url
return None
cl = Librarian()
#example not exists
#sample_non_existing_page_url = "https://sci-hub.se/10.4324/9781003006237"
#sample usage to download
#sample_existing_page_url = "https://sci-hub.se/10.1057/9781137435026"
#print(cl.download(sample_existing_page_url))
cl.search_crossref("BDSM")
#1. robi liste wyników i ją wyświetla - ale tylko tytuły niezależnych dzieł - jeśli jest coś w containerze to trza pogrupować
#2. Tworzy przyciski pozwalające sprawdzić czy jest dostępne - i jeśli jest zwraca link
#3. Jest też przycisk "more" - wyszukujemy po 100, wyświetlamy po 20. Po 100 jak jeszcze to dopiero odpytujemy crossref przyciski strzałek przesuwają po obecnej porcji danych