mirror of
https://github.com/migatu/conjurer.git
synced 2026-07-17 15:22:10 +00:00
89 lines
3.2 KiB
Python
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 |