mirror of
https://github.com/th3r00t/pyShelf.git
synced 2026-04-28 01:59:35 -04:00
Added import btn, Catalog overide, started server backend
This commit is contained in:
@@ -51,6 +51,7 @@ class Catalogue:
|
||||
self.file_list.append(self.scan_folder(_path))
|
||||
else:
|
||||
self.file_list.append(_path)
|
||||
print(_path+"\n")
|
||||
|
||||
def filter_books(self):
|
||||
"""
|
||||
@@ -264,18 +265,24 @@ class Catalogue:
|
||||
c = set.difference(a, b)
|
||||
return c
|
||||
|
||||
def import_books(self, list=None):
|
||||
def import_books(self, list=None, **kwargs):
|
||||
"""
|
||||
Main entry point for import operations.
|
||||
Gets a list of new files via compare_shelf_current.
|
||||
Iterates over list and inserts new books into database.
|
||||
"""
|
||||
# TODO Refactor metadata extraction into process_book \
|
||||
# call to more easily handle additional formats
|
||||
try:
|
||||
fsocket = kwargs['socket']
|
||||
except KeyError:
|
||||
fsocket = '/dev/null'
|
||||
book_list = self.compare_shelf_current()
|
||||
db = Storage(self.config)
|
||||
for book in book_list:
|
||||
book = self.process_by_filetype(book)
|
||||
with open(fsocket, 'w') as _socket:
|
||||
_socket.write(book[0])
|
||||
_socket.close()
|
||||
breakpoint()
|
||||
db.insert_book(book)
|
||||
inserted = db.commit()
|
||||
if inserted is not True:
|
||||
|
||||
55
src/backend/lib/overide.py
Normal file
55
src/backend/lib/overide.py
Normal file
@@ -0,0 +1,55 @@
|
||||
from pathlib import Path
|
||||
from .config import Config
|
||||
from .storage import Storage
|
||||
from .library import Catalogue
|
||||
import asyncio
|
||||
import os
|
||||
import websockets
|
||||
|
||||
|
||||
class ACatalogue(Catalogue):
|
||||
"""
|
||||
Aynchronous overide of library.Catalogue,
|
||||
: TODO : Complete or discard this overide
|
||||
"""
|
||||
def __init__(self):
|
||||
super().__init__(Config(Paths.cwd().parent))
|
||||
|
||||
async def scan_folder(self, _path=None):
|
||||
"""
|
||||
Scan folder by _path, allows recurisive scanning
|
||||
"""
|
||||
if _path is not None:
|
||||
folder = _path
|
||||
elif os.path.isdir(str(self.root_dir) + "/" + self.book_folder):
|
||||
folder = str(self.root_dir) + "/" + self.book_folder
|
||||
else:
|
||||
folder = self.book_folder
|
||||
for f in os.listdir(folder):
|
||||
_path = os.path.abspath(folder + "/" + f)
|
||||
if os.path.isdir(_path.strip() + "/"):
|
||||
self.file_list.append(self.scan_folder(_path))
|
||||
else:
|
||||
self.file_list.append(_path)
|
||||
await asyncio.sleep(0.001)
|
||||
print(_path+"\n")
|
||||
|
||||
async def import_books(self, **kwargs):
|
||||
"""
|
||||
Async overide of import_books
|
||||
"""
|
||||
fsocket = kwargs['socket']
|
||||
book_list = self.compare_shelf_current()
|
||||
db = Storage(self.config)
|
||||
for book in book_list:
|
||||
book = self.process_by_filetype(book)
|
||||
with open(fsocket, 'w') as _socket:
|
||||
_socket.write(book[0])
|
||||
_socket.close()
|
||||
await db.insert_book(book)
|
||||
inserted = db.commit()
|
||||
if inserted is not True:
|
||||
print(inserted)
|
||||
if input("Continue ? y/n") == "y":
|
||||
pass
|
||||
db.close()
|
||||
@@ -1,13 +1,11 @@
|
||||
#!/usr/bin/python
|
||||
#!/usr/bin/env python3
|
||||
import os
|
||||
import time
|
||||
|
||||
import asyncio
|
||||
import websockets
|
||||
from .config import Config
|
||||
from .storage import Storage
|
||||
|
||||
# config = Config()
|
||||
# Storage = Storage()
|
||||
|
||||
|
||||
class InitFiles:
|
||||
"""First run file creation operations"""
|
||||
@@ -34,51 +32,24 @@ class InitFiles:
|
||||
f.close()
|
||||
|
||||
|
||||
class BookDisplay:
|
||||
"""All functions related to displaying book information in the HTML UI"""
|
||||
class Server:
|
||||
"""
|
||||
Main Server Container
|
||||
:TODO: Document this
|
||||
"""
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
"""
|
||||
Initialize class variables
|
||||
:return: None
|
||||
"""
|
||||
self.books_per_page = None
|
||||
self.current_page = 0
|
||||
self.thumbnail_size = [200, 300]
|
||||
self.thumbnail_scale = 1
|
||||
self.total_pages = None
|
||||
def __init__(self):
|
||||
self.loop = asyncio.get_event_loop()
|
||||
self.instance = None
|
||||
|
||||
async def entrypoint(self, websocket, path):
|
||||
_str = await websocket.recv()
|
||||
greeting = f"{_str}"
|
||||
await websocket.send(greeting)
|
||||
|
||||
async def start(self):
|
||||
try:
|
||||
self.screen_size = kwargs["screen_size"]
|
||||
self.instance = await websockets.serve(self.entrypoint, "localhost", 1337)
|
||||
return True
|
||||
except Exception:
|
||||
self.screen_size = [900, 600]
|
||||
|
||||
def nextPage(self):
|
||||
"""
|
||||
## TODO Remove me
|
||||
Goto next book page
|
||||
:return: new current_page
|
||||
"""
|
||||
self.current_page += 1
|
||||
return self.current_page
|
||||
|
||||
def previousPage(self):
|
||||
"""
|
||||
## TODO Remove me
|
||||
Goto previous book page
|
||||
:return: new current_page
|
||||
"""
|
||||
self.current_page -= 1
|
||||
return self.current_page
|
||||
|
||||
def booksPerPage(self, screen_size):
|
||||
"""
|
||||
## TODO Remove me
|
||||
Set books per page
|
||||
:param screen_size: Array containing x,y pixel sizes
|
||||
:return: self.books_per_page
|
||||
"""
|
||||
x = (self.thumbnail_size[0] * self.thumbnail_scale) + 10
|
||||
y = (self.thumbnail_size[1] * self.thumbnail_scale) + 10
|
||||
self.books_per_page = int(self.screen_size[0] // x) * int(
|
||||
self.screen_size[1] // y
|
||||
)
|
||||
raise
|
||||
|
||||
3
src/backend/pyShelf.py
Executable file
3
src/backend/pyShelf.py
Executable file
@@ -0,0 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import websockets
|
||||
@@ -21,17 +21,17 @@ $(document).ready(function(){
|
||||
var s_string = "search by Title, Author, Tags, or Collections";
|
||||
customlog([cmp_height]);
|
||||
$(".search_submit").click(function(){
|
||||
var query = $('.nav_search').val();
|
||||
console.log(query);
|
||||
window.location.href = '/search/'+query;
|
||||
var query = $('.nav_search').val();
|
||||
console.log(query);
|
||||
window.location.href = '/search/'+query;
|
||||
});
|
||||
$('.nav_search').on('keypress', function (e) {
|
||||
if(e.which === 13){
|
||||
$(this).attr("disabled", "disabled");
|
||||
var query = $('.nav_search').val();
|
||||
window.location.href = '/search/'+query;
|
||||
$(this).removeAttr("disabled");
|
||||
}
|
||||
if(e.which === 13){
|
||||
$(this).attr("disabled", "disabled");
|
||||
var query = $('.nav_search').val();
|
||||
window.location.href = '/search/'+query;
|
||||
$(this).removeAttr("disabled");
|
||||
}
|
||||
});
|
||||
$('.nav_link').on('mouseover', function (e){
|
||||
var popover_str = $(this).attr('alt');
|
||||
@@ -59,13 +59,13 @@ $(document).ready(function(){
|
||||
});
|
||||
$('.input_box').focusout(function(){
|
||||
if ($(this).hasClass('nav_search') && $(this).val() == "") {
|
||||
$(this).attr("value", s_string);
|
||||
$(this).attr("value", s_string);
|
||||
}
|
||||
if ($(this).attr("id") == "username" && $(this).val() == "") {
|
||||
$(this).attr("value", u_string);
|
||||
$(this).attr("value", u_string);
|
||||
}
|
||||
if ($(this).attr("id") == "password" && $(this).val() == "") {
|
||||
$(this).attr("value", p_string);
|
||||
$(this).attr("value", p_string);
|
||||
}
|
||||
});
|
||||
$('#btn_login').on('click', function(){
|
||||
@@ -130,7 +130,7 @@ $(document).ready(function(){
|
||||
});
|
||||
});
|
||||
$('#btn_logout').on('click', function() {
|
||||
//window.location.href = '/logout';
|
||||
//window.location.href = '/logout';
|
||||
var isopen = $('#pop_over_0').dialog("isOpen");
|
||||
if (isopen) {
|
||||
$('#pop_over_0').dialog("close");
|
||||
@@ -165,7 +165,39 @@ $(document).ready(function(){
|
||||
// Now open this dialog
|
||||
$('#pop_over_0').dialog("open");
|
||||
});
|
||||
$('.logout-btn').on('click', function(){window.location.href = '/logout'});
|
||||
$(document).on('click', '.logout-btn', function(){window.location.href = '/logout'});
|
||||
$(document).on('click', '.import-btn', function(){
|
||||
$.ajax({
|
||||
type: "GET", url: "/live", data: {hook: 'import_books'},
|
||||
success: function (response) {
|
||||
// Set the dialog title
|
||||
$('#pop_over_0').dialog({
|
||||
title: "User Controls",
|
||||
maxHeight: (win_height - 100),
|
||||
minWidth: $("#horiz_nav_main").width(),
|
||||
hide: {effect: "blind", duration: 1000},
|
||||
show: {effect: "blind", duration: 1000},
|
||||
position: {
|
||||
my: "top", at: "bottom", of: $("#horiz_nav_main")
|
||||
}
|
||||
});
|
||||
// clear and create a new container
|
||||
$('#pop_over_0').html('<div id=usercp class="mx-auto">');
|
||||
// Populate the container from response.data
|
||||
$('#usercp').append('<div class="row" id="usercp-inner">');
|
||||
$('#usercp-inner').append(response.data);
|
||||
$('#usercp-inner').append('</div>');
|
||||
$('#usercp').append('</div>');
|
||||
// Close the container
|
||||
$('#pop_over').append('</div>');
|
||||
// Now open this dialog
|
||||
$('#pop_over_0').dialog("open");
|
||||
},
|
||||
error: function (response) {
|
||||
customlog(["Failure", response]);
|
||||
}
|
||||
});
|
||||
});
|
||||
$('#coll_button').on('click', function(){
|
||||
var isopen = $('#pop_over_0').dialog("isOpen");
|
||||
if (isopen){
|
||||
|
||||
@@ -1,9 +1,14 @@
|
||||
import json
|
||||
import os
|
||||
import time
|
||||
import asyncio
|
||||
|
||||
from base64 import b64decode, b64encode
|
||||
from pathlib import Path
|
||||
|
||||
from backend.lib.config import Config
|
||||
from backend.lib.hooks import ACatalogue
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib import auth
|
||||
from django.contrib.auth import authenticate, get_user_model, login, logout
|
||||
@@ -393,17 +398,28 @@ def live(request, **kwargs):
|
||||
if hook == "collection_listing":
|
||||
collections = collections_list()
|
||||
return JsonResponse({"data": collections}, status=200)
|
||||
|
||||
elif hook == "details":
|
||||
try: _pk = request.GET['pk']
|
||||
except KeyError as e: return False
|
||||
book = book_details(Books.objects.get(pk=_pk))
|
||||
return JsonResponse({"data": book}, status=200)
|
||||
|
||||
elif hook == "register":
|
||||
html = render_to_string('signup.html', {'form': SignUpForm}, request)
|
||||
html += render_to_string('login.html', {'form': UserLoginForm}, request)
|
||||
return JsonResponse({"data": html})
|
||||
elif hook == "update_books":
|
||||
print("Update Books")
|
||||
|
||||
elif hook == "import_books":
|
||||
breakpoint()
|
||||
filename = "../data/{}-{}.sock".format(request.user.username, time.strftime("%H:%M:%S"))
|
||||
catalogue = ACatalogue()
|
||||
async def responder(socket):
|
||||
await catalogue.import_books(socket=socket)
|
||||
return JsonResponse({"data": filename})
|
||||
asyncio.run(responder(filename))
|
||||
|
||||
|
||||
else: return JsonResponse(err_txt, status=404)
|
||||
|
||||
return JsonResponse({"data": "Response sent"}, status=200)
|
||||
|
||||
Reference in New Issue
Block a user