mirror of
https://github.com/migatu/conjurer.git
synced 2026-07-18 07:42:09 +00:00
Work in progress
This commit is contained in:
@@ -9,6 +9,9 @@ from json.decoder import JSONDecodeError
|
|||||||
from platform import uname
|
from platform import uname
|
||||||
from sys import platform
|
from sys import platform
|
||||||
from urllib.request import urlopen
|
from urllib.request import urlopen
|
||||||
|
import asyncio
|
||||||
|
from queue import Queue
|
||||||
|
from threading import Thread
|
||||||
from habanero import Crossref
|
from habanero import Crossref
|
||||||
from waitress import serve
|
from waitress import serve
|
||||||
|
|
||||||
@@ -24,6 +27,9 @@ elif platform == "win32":
|
|||||||
#HOST_ADDRESS = "192.168.1.191"
|
#HOST_ADDRESS = "192.168.1.191"
|
||||||
HOST_ADDRESS = "0.0.0.0"
|
HOST_ADDRESS = "0.0.0.0"
|
||||||
PORT_ADDRESS = 5001
|
PORT_ADDRESS = 5001
|
||||||
|
DATABASE_PATH = r'C:\\Database\\chunks'
|
||||||
|
ENCODING = "utf-8"
|
||||||
|
|
||||||
|
|
||||||
class Librarian(object):
|
class Librarian(object):
|
||||||
|
|
||||||
@@ -62,21 +68,37 @@ class Librarian(object):
|
|||||||
# convert back to json.
|
# convert back to json.
|
||||||
json.dump(file_data, data_file, indent=4)
|
json.dump(file_data, data_file, indent=4)
|
||||||
return result
|
return result
|
||||||
#TODO: check if exists odpala wątki dla kolejnych plików, z każdego wątku dostaje zwrotki - trafienia na bieżąco oraz sygnał że plik się skończył i pora na następny
|
#TODO: check if exists odpala wątki dla kolejnych plików, z każdego wątku dostaje zwrotki - trafienia na bieżąco oraz sygnał że plik się skończył i pora na następny
|
||||||
#TODO: paczki danych są upychane po 10 w tablicy, POSTy ze strony klienta mówią tylko nazwę tablicy (poprzez UUID) oraz którą stronę tejże
|
#TODO: paczki danych są upychane po 10 w tablicy, POSTy ze strony klienta mówią tylko nazwę tablicy (poprzez UUID) oraz którą stronę tejże
|
||||||
#TODO: jeśli UUID nie istnieje to budujemy całość dla nowego uuid
|
#TODO: jeśli UUID nie istnieje to budujemy całość dla nowego uuid
|
||||||
#TODO: kiedy wszystkie wątki pilokowe się zakończą - zamykamy merger i dajemy znać do procedury obsługi odpowiadania na posty że dla tego uuid już nic więcej nie znajdziemy
|
#TODO: kiedy wszystkie wątki pilokowe się zakończą - zamykamy merger i dajemy znać do procedury obsługi odpowiadania na posty że dla tego uuid już nic więcej nie znajdziemy
|
||||||
#TODO: po 60 minutach storeujemy wyniki zapytania pod query w sql i kasujemy UUID
|
#TODO: po 60 minutach storeujemy wyniki zapytania pod query w sql i kasujemy UUID
|
||||||
#TODO: Później robimy tak że query jest najpierw sprawdzane w sql - i dawane jako "zapisana lokalna kopia"
|
#TODO: Później robimy tak że query jest najpierw sprawdzane w sql - i dawane jako "zapisana lokalna kopia"
|
||||||
#TODO: Paginacja - najpierw hity z pliku, potem na końcu to co nie zwróciło żadnych hitów - i to dopiero można crawlerem sprawdzić
|
#TODO: Paginacja - najpierw hity z pliku, potem na końcu to co nie zwróciło żadnych hitów - i to dopiero można crawlerem sprawdzić
|
||||||
|
|
||||||
def check_if_exists(self,page_url):
|
def check_dois_in_file(self, file_name, dois, out_queue):
|
||||||
|
with open(f'{DATABASE_PATH}{file_name}', "r+", encoding=ENCODING) as file:
|
||||||
|
while True:
|
||||||
|
# Get next line from file
|
||||||
|
line = file.readline()
|
||||||
|
if line == dois:
|
||||||
|
return True
|
||||||
|
# if line is empty
|
||||||
|
# end of file is reached
|
||||||
|
if not line:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def check_dois_in_local_db(self, dois):
|
||||||
|
_sentinel = object()
|
||||||
|
chunk_list = []
|
||||||
|
q = Queue()
|
||||||
|
|
||||||
return None
|
for file in chunk_list:
|
||||||
|
t = Thread(target = self.check_dois_in_file, args = (file ,dois, q))
|
||||||
|
t.start()
|
||||||
|
q.put(_sentinel)
|
||||||
|
|
||||||
in_scihub_db = True
|
def check_if_exists(self, page_url):
|
||||||
if not page_url.startswith(("http:", "https:")):
|
if not page_url.startswith(("http:", "https:")):
|
||||||
raise ValueError("URL must start with 'http:' or 'https:'")
|
raise ValueError("URL must start with 'http:' or 'https:'")
|
||||||
# trunk-ignore(bandit/B310)
|
# trunk-ignore(bandit/B310)
|
||||||
@@ -86,13 +108,6 @@ class Librarian(object):
|
|||||||
for line in text.splitlines():
|
for line in text.splitlines():
|
||||||
if re.match(r".*Unfortunately, Sci-Hub doesn't have the requested document.*", line):
|
if re.match(r".*Unfortunately, Sci-Hub doesn't have the requested document.*", line):
|
||||||
return None
|
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):
|
if m := re.match(r".*<embed type=\"application.pdf\"\s*src=\"(.*\.pdf)",line):
|
||||||
return "https:" + str(m.group(1))
|
return "https:" + str(m.group(1))
|
||||||
return None
|
return None
|
||||||
|
|||||||
Reference in New Issue
Block a user